X86汇编快速入门

本文介绍了X86汇编语言的基础知识,包括寄存器结构、内存寻址模式、数据传送指令、逻辑计算指令以及函数调用的 caller 和 callee 规则。重点讲解了EAX、ECX等寄存器的作用,以及如何声明和访问内存数据。同时,文章阐述了数据声明的长度规定,如BYTE PTR、WORD PTR和DWORD PTR。此外,还涵盖了汇编指令如mov、push、pop、add、sub等的使用方法,以及如何进行条件跳转。最后,详细说明了caller如何保存和恢复寄存器值,以及callee如何处理局部变量和保存寄存器。
摘要由CSDN通过智能技术生成

本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令、逻辑计算指令、算数运算指令),以及函数的调用规则。个人认为:在理解了本文后,基本可以无障碍地阅读绝大部分标准X86汇编程序。当然,更复杂的指令请参阅Intel相关文档。

1 寄存器.

主要寄存器如下图所示:

寄存器结构

X86处理器中有8个32位的通用寄存器。由于历史的原因,EAX通常用于计算,ECX通常用于循环变量计数。ESP和EBP有专门用途,ESP指示栈指针(用于指示栈顶位置),而EBP则是基址指针(用于指示子程序或函数调用的基址指针)。如图中所示,EAX、EBX、ECX和EDX的前两个高位字节和后两个低位字节可以独立使用,其中两位低字节又被独立分为H和L部分,这样做的原因主要是考虑兼容16位的程序,具体兼容匹配细节请查阅相关文献。

应用寄存器时,其名称大小写是不敏感的,如EAX和eax没有区别。

2 内存和寻址模式

2.1声明静态数据区

可以在X86汇编语言中用汇编指令.DATA声明静态数据区(类似于全局变量),数据以单字节、双字节、或双字(4字节)的方式存放,分别用DB,DW, DD指令表示声明内存的长度。在汇编语言中,相邻定义的标签在内存中是连续存放的。

.DATA      
var DB 64   ;声明一个字节,并将数值64放入此字节中
var2 DB ? ; 声明一个为初始化的字节.
  DB 10 ; 声明一个没有label的字节,其值为10.
X DW ? ; 声明一个双字节,未初始化.
Y DD 30000     ; 声明一个4字节,其值为30000.

还可以声明连续的数据和数组,声明数组时使用DUP关键字

Z DD 1, 2, 3 ; Declare three 4-byte values, initialized to 1, 2, and 3. The value of location Z + 8 will be 3.
bytes   DB 10 DUP(?) ; Declare 10 uninitialized bytes starting at location bytes.
arr DD 100 DUP(0)     ; Declare 100 4-byte words starting at location arr, all initialized to 0
str DB 'hello',0 ; Declare 6 bytes starting at the address str, initialized to the ASCII character values for hello and the null (0) byte.

2.2 寻址模式

现代X86处理器具有232字节的寻址空间。在上面的例子中,我们用标签(label)表示内存区域,这些标签在实际汇编时,均被32位的实际地址代替。除了支持这种直接的内存区域描述,X86还提供了一种灵活的内存寻址方式,即利用最多两个32位的寄存器和一个32位的有符号常数相加计算一个内存地址,其中一个寄存器可以左移1、2或3位以表述更大的空间。下面例子是汇编程序中常见的方式

mov eax, [ebx] ; 将ebx值指示的内存地址中的4个字节传送到eax中
mov [var], ebx ; ebx的内容传送到var的值指示的内存地址中.
mov eax, [esi-4] ; 将esi-4值指示的内存地址中的4个字节传送到eax中
mov [esi+eax], cl ; 将cl的值传送到esi+eax的值指示的内存地址中
mov edx, [esi+4*ebx]     ; 将esi+4*ebx值指示的内存中的4个字节传送到edx

下面是违反规则的例子:

mov eax, [ebx-ecx] ; 只能用加法
mov [eax+esi+edi], ebx     ; 最多只能有两个寄存器参与运算

2.3 长度规定

在声明内存大小时,在汇编语言中,一般用DB,DW,DD均可声明的内存空间大小,这种现实声明能够很好地指导汇编器分配内存空间,但是,对于

mov [ebx], 2

如果没有特殊的标识,则不确定常数2是单字节、双字节,还是双字。对于这种情况,X86提供了三个指示规则标记,分别为BYTE PTR, WORD PTR, and

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值