汇编指令笔记

寄存器

数据寄存器

AX: AH-AL (数据累加器, 可用于乘、 除、输入/输出等操作)

BX: BH-BL (基址寄存器, 可作为存储器指针来使用)

CX: CH-CL (计数寄存器, 可用来控制循环次数)

DX: DH-DL (数据寄存器, 在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址)

变址寄存器

主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便, 也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。

ESI: 32bit == SI: 16bit (源变址寄存器, 与DS联用, 指示数据段中某操作的偏移量. 在做串处理时, SI指示源操作数地址, 并有自动增量或自动减量的功能。 变址寻址时, SI与某一位移量共同构成操作数的偏移量)

EDI: 32bit == DI: 16bit (与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能)

指针寄存器

主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便, 也可存储算术逻辑运算的操作数和运算结果。

EBP: 32bit == BP: 16bit (基指针寄存器, 用它可直接存取堆栈中的数据)

ESP: 32bit == SP: 16bit (堆栈指针寄存器, 始终只是栈顶的位置, 与SS寄存器一起组成栈顶数据的物理地址)

段寄存器

段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。

  • 16位

    CS——代码段寄存器,存放当前程序的指令代码

    DS——数据段寄存器,存放程序所涉及的源数据或结果

    ES——附加段寄存器,辅助数据区, 存放串或其他数据

    SS——堆栈段寄存器,其值为堆栈段的段值

  • 32位

    FS——附加段寄存器,其值为附加数据段的段值

    GS——附加段寄存器,其值为附加数据段的段值

指令

cmp (配合jz, jnz)

算数运算指令,比较两个值,如果相等则设置ZF(零标志)为1, 可用jz(jump if zero)或jnz(jump if not zero)指令检查ZF位, jz(ZF零标志为1)即相等, jnz(ZF零标志为1)即不相等

1
2
3
4
5
6
7
8
9
10
11
12
13
例:

compare:
mov $0x1000, %ax
cmp $0x1000, %ax ;判断ax寄存器中的值是否为0x1000
jz is_equal ;如果相等,则跳转到代码段is_equal
jnz is_not_equal ;如果不相等,则跳转到代码段is_not_equal

is_equal:
;do something

is_not_equal:
;do something

rep

重复执行后面的指令,直到cx寄存器中的值为0

1
2
3
4
5
例:
example:
mov $0, %ax //将ax寄存器置0
mov $0x1000, %cx
rep add $1, %ax //使ax寄存器加1,执行1000