文档库 最新最全的文档下载
当前位置:文档库 › Windows汇编基础入门

Windows汇编基础入门

Windows汇编基础入门
Windows汇编基础入门

一.环境配置

1.1. MASM32 SDK

下载https://www.wendangku.net/doc/c311700563.html,

1.2 EditPlus Masm环境配置

1.下载语法文件模板(下载地址https://www.wendangku.net/doc/c311700563.html,/others.html)。找到masm615.zip下载,然后解压,放到C:/ProgramFiles/EditPlus 3(通常语法文件都放回EditPlus的目录,以免不见了)。

Asm.acp Asm.asm asm.bat Makefile var.bat

1.3 WinDbg环境配置

符号表下载地址:

https://www.wendangku.net/doc/c311700563.html,/download/symbols/packages/windowsxp/Windows XP-KB835935-SP2-slp-Symbols.exe

WinDbg下载地址:

https://www.wendangku.net/doc/c311700563.html,/download/symbols/debuggers/dbg_x86_6.5.3.8. exe

安装VMWare虚拟机,并在虚拟机里安装操作系统,如WinXP SP2。安装完成后修改boot.ini文件。在里面[operating systems]节中加入一行,

" multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WIN XP Debug"

/fastdetect /debug /debugport=com2 /baudrate=115200 "

另外建议将[boot loader]节下的timeout修改为一个较大的值,这样倒计时会比较长我们能有足够的时间来选择系统加载菜单。

随后关闭系统配置虚拟机的硬件,点击"Edit virtual machine settings",添加一个Serial Port,选择"Output to named pipe",然后下一步;

第一框里保持默认的 "\\.\pipe\com_2"

第二框里选"This end is the server."

第三框里选"The other end is an application."

选中 "Connect at power on"

然后点击"Advanced>>"然后在新窗口中选中 "Yield CPU on poll",保存退出。

在真实系统中查看"设备管理器",在端口里找到Com2,然后再属性页中的“端口设置”修改速率为115200。

为使方便,在WinDbg的快捷方式属性中的“目标(T)”栏里输入:

"C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64\windbg.exe" -y C:\Symbols\ -b -k com:port=\\.\pipe\com_2,baud=115200,pipe

二.基本知识

2.1使用MASM

1实模式处理器工作的基础,Dos操作系统

2保护模式寻址范围有4GB,Windows操作系统

3 虚拟86模式为了兼容以前的MS-DOS程序,采用模拟的方法

4 可读可写的未定义变量(如缓冲区或者程序执行后才开始使用的)放在.data?,存放在_BSS节区,初始值为0

5 返回值永远在eax中,如果是结构体放在指向返回数据的指针

6 mov ax,word ptr szBuffer 强制类型转换

7 szHello db ‘Hello’,0dh,0ah

Db ‘World’,0

Sizeof szHello 的值为7

8 offset 是在编译时完成的,对于局部变量ebp不确定所以要使用addr,把地址放入eax中,用eax来代替变量地址使用

ADDR 只能用在invoke语句中,它既可以获取全局变量的地址(.Data和.Data?中声明的变量),也可以获取局部变量的地址,由于在存取堆栈获取参数地址时使用了EBP和EAX,所以如果在ADDR标识的局部变量前使用EAX或者EBP寄存器作为参数就会出错。

9 条件测试语句中表达式左边不能是常数,两边不能同时是变量

10 循环语句,注意条件比较的操作数总看作无符号数

.while 表达式

.break .if 条件

.continue

.endw

.repeat

.break .if

.continue

.until

10 字节存储顺序

Intel 为逆序如12345678h存入以1000h的内存中,低位字节存入低地址,反序

排列

11 Unicode编码

如pediy 它的ASII码为70h 65h 64h 69h 79 h

Unicode 码为0070h 0065h 0064h 0069h 0079h

内存形式为

从低字节到高字节

版本的程序在Windows 9x下无法正常运行

文件的基地址由文件本身所设定,如VisualC++的EXE文件基地址为00400000,DLL基地址为10000000h,可以在链接应用时通过/BASE选项改变它

2.2寄存器相关

(1) EAX 累加器,常见运算操作和函数返回值,优化的指令会优先将数据写入或读出EAX寄存

器,再对数据进行进一步的计算,运算操作会借助EAX达到指令优化的效果,乘法和除法必须在EAX中进行

(2)EDX,数据寄存器,是EAX延伸的部分,协助一些复杂的指令如乘法和除法,

(3)ECX,计数器,支持循环操作,反向计数,

(4)ESI,源变址寄存器,存储输入数据流的位置信息,用于读

(5)EDI,目的变址寄存器,存储结果的存放位置,用于写

(6)ESP,始终指向函数栈的最顶端,在调用函数的某一时刻,ESP指向了函数的返回地址

(7)EBP,指向函数栈的底端,在某些情况下,为了优化指令,会避免EBP作为栈帧指针,被释放的

EBP寄存器会作为它用

(8)EBX,作为额外的存储单元

(9)EIP,始终指向正在执行的指令

2.3 调试事件

(1)断点触发

<1>软断点

使目标进行执行到某一个位置停下来,从双字节长的操作码8BC3(move ax,ebx)中替换一个字节,使用0xCC(int 3),当CPU试图执行CC时,触发一个断点事件,可是在内存中改变可执行代码的某个字节时,同时改变了这个运行程序的循环冗余校验值,CRC校验将选取一定范围内的数据,一些软件往往会检测自已在内存中的运行代码的CRC校验值,一旦检测失败就会自我了断,是一种防止软断点的非常有效的技术.

<2>硬件断点

适用场合:调试目标使用CRC反调试,

使用位于CPU上的调试寄存器,

DR0-DR3存储硬件断点的内存地址,

DR4-DR5 保留使用

DR6 调试状态寄存器,记录上一次断点触发所产生的调试事件类型信息

DR7 硬件断点的激活开关,存储各个断点的触发条件信息

通过设置DR7,可以实现

A)当位于一个特定内存地址上的指令被执行时触发断点

B)当数据被写入一个特定内存地址时触发断点

C)当数据被读出或写入(不包括执行)一个特定非可执行内存地址时触发断点

硬件中断使用INT 1 ,功能强大,但是存在一些限制,在任意时刻最多只能设置4个断点,最多只能对4个字节长的数据设置断点,当想跟踪一大块内存的访问情况时,硬件断点能力有限,这时要使用内存断点

<3>内存断点

当一个调试器设置一个内存断点时,调试器实质是改变一个内存区域或一个内存页的访问权限,

A)页可执行:允许进程执行页上的代码,如果进程试图读写这个页将导致非法内存访问

B)页可读:进程只能从这个内存页中读取数据,任何试图写入数据或者执行代码的操作

会导致非法内存操作异常

C)页可写:允许进程在这个内存页上写入数据

D)保护页:对保护页任何类型的访问将导致一次性异常,之后这个内存页会恢复到之前

的状态,用于隔离堆栈,确保一个内存块的增长不会超出某一个预定边界。当进程访问一个特定区域内的内容时,可以让进程暂停执行,基于网络的服务器应用程序通常有一个数据缓冲区用于专门存储从网络上接收到的数据包,我们可以对这块内存区域设置内存断点,使得我们可以判断出这个应用程序何时以及如何处理接收到的数据包内容,因为任何对这块区域内的内存访问会导致CPU暂停执行当前进程并触发一个保护页调试异常,然后我们可以对访问块缓冲区的指令代码进行调查,并判断出应用程序如何处理缓冲区的内容,利用该断点技术可以绕过软断点所面临的指令篡改问题.

多数操作系统允许组合不同的访问权限。

(2)非法内存操作

(3)由被调试程序抛出的异常

(4)DebugActiveProcess()实现进程的附加,一旦有足够的权限,目标进程会附加到调试器进程,

接下来调试器只需在一个循环中不断调用WaitForDebugEvent()将发生在目标进程中的调试事件尽收眼中,处理完相关事件之后,调用ContinueDebugEvent()来将目标进程恢复至原先的执行状态,利用DebugActiveProcessStop()使调试器与被调试进程分离.

要算出目标内存区域的边界位置,调用GetSystemInfo(),向操作系统本身查询当前默认的内存页大小设,使用VirtualQueryEx()以参数传值的形式返回一个MEMORY_BASIC_INFORMATION结构,找到与目标内存页相关的属性信息,使用VirtualProtectEx()设置内存页的访问权限,当一个保护页被访问进而导致异常事件被抛出时,系统将自动移除相关内存页的保护属性,

2.4 其它

1.栈的增长方向是由高到低,堆的增长方式由低到高

2.发生函数调用时,先把参数压入栈

Push arg1

….

Push argN

3.将指令寄存器中的内容压入栈作为返回地址ret

Push eip

4.将基址寄存器EBP中的内容压入栈,然后把当前栈指针esp复制到ebp,作为新的基址,最后为本地变量留出一定的空间,把esp减去适当的数值.

Push ebp

Sub esp,bufsize //为本地变量留出一定的空间

例如strcpy(dst,src),如果传递的参数超过了范围,将会修改返回指针的地址

指向NOP中的任一位置,执行nop指令之后激活shell进程,

三.语法知识

3.1.常量

1. 1110B 二进制

2. 17Q 八进制

3.-89 十进制

4. 8Bh 十六进制

3.2 注释

comment ^

^

3.3 格式化信息

buffer db 80 dup(0)

szFmt db '%d',0

invoke wsprintf,addr buffer,addr szFmt,10 3.4 masm32.lib

1.屏幕输出Stdout和从键盘输入

.data

Msg db "请输入"

BUF db 12 dup(0)

.code

invoke StdOut,ADDR Msg

invoke StdIn,ADDR BUF,LENGTHOF BUF 3.5 局部变量

1.LOCAL @val:dword

2.LOCAL @buf[1024]:byte 字节缓冲区

3.6 EQU伪指令

1.SUM EQU 100 (常量名和整数表达式)

2.PI EQU <

3.14> 定义非整数值和字符串

3. PRE EQU <"abc">

3.7 当前地址运算符$

Array db 10,20,30

ArraySize =($-Array)

3.8 OFFSET,ADDR和LEA指令

1.ADDR 和OFFSET 操作符在编译时起作用

2.LEA在程序运行时起作用,在计算堆栈变量的偏移地址时只能用LEA

TEST PROC

LOCAL @buf[1024]:BYTE

LEA EDI,@buf

TEST ENDP

3.9 ALIGN 和EVEN 指令

ALIGN 边界值(1,2,4) 按边界值的倍数对齐

因为CPU处理器处理偶数地址的速度比处理奇数地址快,编译器会插入空字节。

4.0 PTR操作符,强制类型转换

LIST DB 12h,34h,56h,78h

mov al,LIST ;al=12h(类型一致)

mov ax,WORD PTR LIST ;ax=3412h

4.1 TYPE 操作符

返回变量的字节大小

var1 db ?

TYPE var1 ;返回值为1

4.2 LENGTHOF 操作符

返回变量右边所包含元素的个数(以变量本身的类型为单位)

var1 BYTE 20,12,24 ; 3个元素

var2 WORD 20 DUP(?),0,0; 20+2个元素

var3 DWORD 10 DUP(3 DUP(?)) 3*10个元素

var4 db "1234",0 5个元素

LENGTHOF var1 ;返回值为3

4.3 SIZEOF 操作符

SIZEOF 返回是LENGTHOF 和TYPE 的乘积。

ARRAY DW 100,200,300

LENGTHOF ARRAY 返回3

TYPE ARRAY 返回2

SIZEOF ARRAY 返回2*3

4.4 LABLE指令

变量名LABEL 数据类型(BYTE,WORD,DWORD,QWORD,TBYTE)等。

LIST16 LABLE WORD ;别名变量LIST16 不占用存储空间

.data

LIST32 LABLE DWORD

var1 WORD 1234h

var2 WORD 5678h

.code

mov eax,LIST32; EAX=56781234h

4.5 TYPEDEF和TYPEDEF PTR

定义新类型

BOOL TYPEDEF DWORD; 用BOOL 代替DWORD

定义指针类型

LPBYTE TYPEDEF PTR BYTE ;LPBYTE 为指向字节的指针

LPVOID TYPEDEF PTR

TYPEDEF PTR 和OFFSET的功能类似

4.6 ORG 指令

ORG 10; 数据或指令存放地址

var1 dw 1234h

4.7 while-endw

.data

a d

b 10 dup(0) ;定义字节数组

.code

start:

mov edi,0

.while(i<10)

mov al,i

mov a[edi],al

inc i

inc edi

.endw

4.8 repeat-util

mov edi,0

.repeat

mov eax,i

mov a[edi],eax

inc i

add edi,4

.until (i>=10)

4.9 if elseif endif

.if eax>=5

.continue

.else

.endif

5.0 结构体

student STRUCT

name db 7 dup(?)

a dd

student END

变量初始化ab student <1,2>

改变结构体的值

mov ax,12

mov ab.a,ax

存取结构体数组的值

stPos COORD 4 dup(<0,0>)

mov ecx,4

mov edi,offset stPos

mov eax,1

mov ebx,11

@@:

mov (COORD ptr[edi]).x ax

add edi,type COORD ;指向下一个结构体

inc ax

loop short @B

POINTS equ 用EQU定义结构体变量

5.1 条件汇编

IFDEF 名字:如果名字已定义,则汇编

IFNDEF 名字

EXITM 退出汇编

IFNDEF _NT_

_NT_ equ 1

5.2 过程

过程的使用要满足先声明后使用的原则

1.过程的声明

将过程中的proc改为PROTO ,过程的入口参数用:DWORD取代即可

AsciiTo PROTO:DWORD ;声明

My proc num:DWORD,ptr2:PTR DWORD

My PROTO,:DWORD,:PTR DWORD 声明

2.过程的值传递

swap PROC USES eax var1:DWORD,var2:DWORD

mov eax,var1

xchg eax,var2

mov var1,eax

ret

swap PROC

invoke swap,Arr,Arr+4

3.过程的地址传递

swap PROC USES eax esi edi,

ptr1:PTR DWORD ;ptr1为指针变量

ptr2:PTR DWORD

mov esi,ptr1

mov edi,ptr2

mov eax,[esi]

xchg eax,[edi]

mov [esi],eax

ret

swap endp

invoke swap,ADDR Arr,Arr+4 ;地址传递

5.3 代码优化

1.巧妙使用lea指令,其本身可作为一条超级加法指令来使用,

如:lea ecx,[eax+ebx+4+a]

lea 的优势在于它只有一个微操作,只需一个时钟周期,lea指令和ADD,SUB,SHIFT等指令联用可替代耗时的乘法指令

2.避免使用复杂指令

enter,leave,loop 包含的微操作大于4,需要更长的解码周期

dec ecx

jg NextLoop

代替loop NextLoop

push ebp

3. Test指令的使用

比较时尽量使用test指令,而and指令要把结果回写,在比较相等时,test的指令要优于cmp,其指令码更短些。

4.寄存器清零

xor reg,reg

但是这会改变标志寄存器,如果不想改变寄存器,可使用

mov reg,0

5.使用正确的数据对齐,优先使用128,64,32,不要使用16以下字长的变量内存,比如使用BOOL(32位)的变量,不要使用16位的bool变量,对同一内存区域,要尽量使用相同长度的数据,并且使用相同的数据对齐方式。

6.不使用小寄存器,ax,al,ah等,优先使用32位和64位寄存器

7.尽量使用32位寄存器,否则会造成7个周期的延迟

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

IAR -arm 入门教程

IAR 使用说明 关于文档(初版): 1.主要是为了给IAR的绝对新手作参考用 2.emot制件,由Zigbee & IAR 学习小组保持修订权 3.希望用IAR朋友能将它修订完善 4.任何人可无偿转载、传播本文档,无须申请许可,但请保留文档来源及标志 5.如无重大升级,请沿用主版本号 版本 版本号制作时间制定人/修改人说明 1.00 2008/7/27 emot 初版(仅供新手参考) 1.01 2010/8/19 Emot 增加 下载程序(第四章) 在线调试程序(第五章) 序: 其实IAR和keil区别也没有多大,不过很多人就是怕(当初我也怕)。怕什么呢,怕学会了,真的就是害怕学习的心理让新手觉得IAR是个不好用的或者说“还不会用的”一个工具吧。我也是一个刚毕业的小子,如果说得不妥,还请大家来点砖头,好让小组筑高起来。(Zigbee & IAR 学习小组地址是https://www.wendangku.net/doc/c311700563.html,/673) 初版我将会说明以下3个问题,IAR的安装、第一个IAR工程的建立和工作编译。这是我写的第一个使用说明,不足的以后补充吧。 一、IAR软件安装图解 1.打开IAR软件安装包进入安装界面 打开软件开发包

软件安装界面 2.按照提示步骤执行,一直到授权页面,输入序列号,IAR中有两层序列号,所以要输入两 组序列号。 输入第一组序列号

3.选择安装路径(最好默认,不默认也不影响使用) 路径选择页面

修改路径4.选择全部安装(Full) 选择全部安装5.按提示知道安装完成。

安装完成页面 二、新建第一个IAR工程 用IAR首先要新建的是工作区,而不是工程。在工作区里再建立工程,一个工作区里似乎也不能建多个工程(我试过,但没成功,不知道IAR里提出workspace的概念是为什么?)要不打IAR的help来看,说清楚也是头痛的事,先知道有要在工作空间里建工程就对了。新建IAR工作空间,首先是菜单File里选择Open再选择Workspace,为方便说明再遇到菜 单我就直接说成File-Open-Workspace这样了。看了下面图上的红圈就知道是怎么回事了。 接着就会看到一片空白。这时就是新的“办公区”了。

Linux基本反汇编结构与GDB入门

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、基本操作指令 简单的操作数类型说明,一般有三种, (1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。 (2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。 (3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。 图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元

注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。从上面的图我们就可以大致了解操作数的类型了。 在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。 1、movl $0x4050, %eax 立即数——寄存器 2、movl %ebp, %esp 寄存器——寄存器 3、movl (%edi, %ecx), %eax 存储器——寄存器 4、movl $-17, (%esp) 立即数——存储器 5、movl %eax, -12(%ebp) 寄存器——存储器 注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的, 结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大, 如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,studyrush@studyrush-desktop:~/C$ vi exchange.c vi 后面加我们要创建的程序文件的名字,在这里是exchange.c studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。 studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示运行程序,下面是运行的结果。 a = 3, b = 4

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.wendangku.net/doc/c311700563.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

Windows汇编语言程序设计基础

第1章Windows汇编语言程序设计基础 Windows汇编语言程序分为控制台编程和图形界面编程两种,控制台编程相对简单一些。为了由浅入深,本书从控制台编程开始讲解。 读者总希望用最快的速度掌握书中的概貌,为此从一个最简单的程序开始。一些汇编语言语法也结合程序进行讲解,有些指令和语法用注解的方法说明。 1.1 第一个完整的Windows汇编语言程序 Windows汇编语言程序有自己的编程规范,它的编程规范比Visual C要简单得多,调试也很方便。更重要的是系统把重要的东西都呈现给读者,使读者更能掌握其中的本质。 用一条一条的汇编语言指令很难写出大程序,Windows汇编语言程序也是调用系统提供的API来写程序。因而,用Windows汇编语言同样可写出大程序。以下是一个最简单的Windows程序。 ;程序功能:显示一个信息框。 ;ex1.asm(e:\masm\base) ;程序名 ;编译链接方法: ;ml /c /coff ex1.asm ;link /subsystem:console ex1.obj .386 ;指明指令集 .model flat,stdcall ;程序工作模式,flat为Windows程序使用的模式(代码和数据 ;使用同一个4GB段),stdcall为API调用时右边的参数先入栈option casemap:none ;指明大小写敏感 include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data ;数据段 szCaption db '抬头串',0 szText db 'Hello!',0 .code ;代码段 start:

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

Windows X86-64位汇编语言入门

Windows X86-64位汇编语言入门 Windows X64汇编入门(1) 最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。 文章的标题包含了本文的四方面主要内容: (1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista 64位版,调用的均为windows API。 (2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。至于三者间的区别,可自行搜索。 (3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。 (4)入门:既是入门,便不会很全。其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。其二,便于类似我这样刚接触x64汇编的新手入门。 本文所有代码的调试环境:Windows Vista x64,Intel Core 2 Duo。 1. 建立开发环境 1.1 编译器的选择 对应于不同的x64汇编工具,开发环境也有所不同。最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio 2005一起发布。因此,如果你是微软的忠实fans,直接安装VS2005既可。运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC 资源编译器,且自带了Include目录。它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。因此,本文的代码就在GoASM下编译。 第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。 不同的编译器,语法会有一定差别,这在下面再说。 1.2 IDE的选择 搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。因此,最简单的方法是自行修改EditPlus的masm语法文件,这也是我采用的方法,至少可以得到语法高亮。当然,如果你懒得动手,那就用notepad吧。 没有IDE,每次编译时都要手动输入不少参数和选项,做个批处理就行了。 1.3 硬件与操作系统 硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了

OllyDBG完美教程

关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编 一、OllyDBG 的安装与配置 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可: OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助: 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签: 因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个 UDD 目录

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

汇编语言基础知识

汇编语言基础知识 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有 效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel 公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。 1.1 微型计算机概述 微型计算机由中央处理器(Central Processing Unit ,CPU )、存储器、输入输出接口电路和总线构成。CPU 如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键指标。存储器包括随机存储器(Random Access Memory ,RAM )和只读存储器(Read Only Memory ,ROM )。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU 和其他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本结构。 外部设备存储器输入输出接口电路中央处理器 CPU 地址总线 数据总线 控制总线 图1.1 微型计算机基本结构 特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变 为各个部件面向总线的单一关系。一个部件只要符合总线结构标准, 就可以连接到采用这种总线结构的系统中,使系统功能得到扩展。 数据总线用来在CPU 与内存或其他部件之间进行数据传送。它是双向的,数据总线 的位宽决定了CPU 和外界的数据传送速度,8位数据总线一次可传送一个8位二进制数据(即一个字节),16位数据总线一次可传送两个字节。在微型计算机中,数据的含义是广义的,数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。 地址总线专门用来传送地址信息,它是单向的,地址总线的位数决定了 CPU 可以直接寻址的内存范围。如 CPU 的地址总线的宽度为N ,则CPU 最多可以寻找2N 个内存单 元。

汇编语言-王爽-完美高清版视频教程

汇编语言》-王爽-完美高清版-零基础汇编语言入门书籍PDF格式 同时按ctrl+要下载的地址既可下载对应的视频 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f61cb107c8 001第一章- 基础知识01 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6806f45b8 002第一章- 基础知识02 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6ec42d4d3 003第一章- 基础知识03 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6deb05ec4 004第一章-基础知识04 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6e51f6838 005第一章- 基础知识05 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f66edaf8d3 006第二章- 寄存器(CPU工作原理)01 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6d07e07b9 007第二章- 寄存器(CPU工作原理)02 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6d7f585a8 008第二章- 寄存器(CPU工作原理)03 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f639d8b3cf 009第二章- 寄存器(CPU工作原理)04 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6dcadbde6 010第二章- 寄存器(CPU工作原理)05 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6ea3f01c1 011第二章- 寄存器(CPU工作原理)06 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f65b96a06f 012第二章- 寄存器(CPU工作原理)07 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f682da085a 013第三章- 寄存器(内存访问)01 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6486e698 014第三章- 寄存器(内存访问)02 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6b7491d9f 015第三章- 寄存器(内存访问)03 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f622b7f9a7 016第三章- 寄存器(内存访问)04 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f64e2424b9 017第三章- 寄存器(内存访问)05 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6e5132d4d 018第三章- 寄存器(内存访问)06 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f655c10e86 019第三章- 寄存器(内存访问)07 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6b22e64e6 020第四章- 第一个程序01 下载地址:https://www.wendangku.net/doc/c311700563.html,/file/f6812126a4

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

OllyDbg入门完全教程(完美排版)

OllyDbg完全教程 目录 第一章概述 (1) 第二章组件 (5) 一、一般原理[General prnciples] (5) 二、反汇编器[Disassembler] (8) 三、分析器[Analysis] (9) 四、Object扫描器[Object scanner] (12) 五、Implib扫描器[Implib scanner] (12) 第三章 OllyDbg的使用 (13) 一、如何开始调试[How to start debugging session] (13) 二、CPU 窗口[CPU window] (14) 三、断点[Breakpoints] (14) 四、数据窗口[Dump] (15) 五、可执行模块窗口[Executable modules window] (16) 六、内存映射窗口[Memory map window] (17) 七、监视与监察器[Watches and inspectors] (19) 八、线程[Threads] (19) 九、调用栈[Call stack] (20) 十、调用树[Call tree] (21) 十一、选项[Options] (21) 十二、搜索[Search] (22) 十三、自解压文件[Self—extracting (SFX) files] (22) 十四、单步执行与自动执行[Step—by—step execution and animation] (23) 十五、Hit跟踪[Hit trace] (23) 十六、Run 跟踪[Run trace] (24) 十七、快捷键 (26) 十八、插件[Plugins] (29) 十九、技巧提示[Tips and tricks] (29) 第四章其他功能 (30) 一、调试独立的DLL[Debugging of stand—alone DLLs] (30) 二、解码提示[Decoding hints] (32) 三、表达式赋值[Evaluation of expressions] (32) 四、自定义函数描述[Custom function descriptions] (34)

反汇编 第二节 常用汇编指令

——啊冲 第二节常用汇编指令 说明:汇编语言也是一门语言,其指令相当的多,非常丰富,在此我只介绍几个常用的、简单的汇编指令,让大家与我一同入门。其实在超多的计算机知识领域里我和大家一样只是个学生而已。所以,我所要求的同学级别(本视频所针对的对象)是:有一点编程经验,对反汇编感兴趣、零基础的朋友。 堆栈操作指令PUSH和POP ?格式: PUSH XXXX ?POP XXXX ?功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令. ? 加减法操作add和sub指令 ?格式: ADD XXXX1,XXXX2 ?功能: 两数相加 ?格式: SUB XXXX1,XXXXX2 ?功能: 两个操作数的相减,即从OPRD1中减去OPRD2,其结果放在OPDR1中.

调用和返回函数CALL和RET(RETN) ?过程调用指令CALL ?格式: CALL XXXX ?功能: 过程调用指令 ?返回指令RET ?格式: RET ?功能: 当调用的过程结束后实现从过程返回至原调用程序的下一条指令,本指令不影响标志位. ? 数据传送MOV 格式: MOV XXXX1,XXXX2 ?功能: 本指令将一个源操作数送到目的操作数中,即XXXX1<--XXXX2. ? 逻辑异或运算XOR ?格式: XOR OPRD1,OPRD2 ?功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中. ? 逻辑或指令OR ?格式: OR OPRD1,OPRD2 ?功能: OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中,本指令可以进行字节或字的‘或’运算.

有效地址传送指令LEA ?格式: LEA OPRD1,OPRD2 ?功能: 将源操作数给出的有效地址传送到指定的的寄存器中. ?实际上,有时候lea用来做mov同样的事情,比如赋值: ?Lea edi,[ebp-0cch] ? 字符串存储指令STOS ?格式: STOS OPRD ?功能: 把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去.指针DI将根据DF的值进行自动调整. ?说明:在VC的DEBUG版里经常用来为局部变量空间写上cccccccc指令 ? 比效指令CMP(CoMPare) ?格式: CMP OPRD1,OPRD2 ?功能: 对两数进行相减,进行比较. ?说明:经常与跳转指令相配合来形成循环或跳出操作 ? 跳转指令JXX ?JMP:无条件转移指令

相关文档
相关文档 最新文档