2018-12-23 汇编学习笔记

一、通用寄存器与系统位数

以累加寄存器为例,在 16 位系统中叫做 ax,在 32 位系统中叫做 eax,在 64 位系统中叫做 rax。但为了兼容,在 32 位系统中,eax 的低 16 位叫做 ax,在 64 位系统中,rax 的低 32 位叫做 eax。

本文在寄存器名字的表述上,皆用 16 位系统下的名字来表述,比如寄存器 ip,泛指任意位数系统中的指令寄存器,即 16 位的 ip,32 位的 eip,64 位的 rip 一律用 ip 代指。


二、指令与地址

(一) 存放指令

指令寄存器 ir:存放当前正在执行的指令的地址

(二) 存放指令地址

程序计数器 PC 即寄存器组合 cs:ip:存放下一条将要执行的指令的地址

代码段寄存器 cs:经过一系列计算可得代码段基址

指令指针寄存器 ip:存放指令在代码段中的偏移地址,会自增

(三) 指令中的地址操作数

若操作数为指令在段中的偏移地址,则取出后存放在指令指针寄存器 ip 中。


三、pusha 指令

将以下寄存器按顺序压栈:

ax、cx、dx、bx、sp、bp、si 及 di。

其中 sp 压栈的值是 ax 压栈之前的值。


四、popa 指令

依次恢复以下寄存器:

di、si、bp、sp、bx、dx、cx 及 ax。


五、iret 指令

依次恢复以下寄存器:

ip、cs、psw(即标志寄存器)、esp、ss。

一般在中断末尾使用 iret 指令,恢复中断前栈帧的下一条指令的地址,恢复标志寄存器,返回中断前栈帧。


六、函数外链接

(一) 函数定义在本文件

[GLOBAL LoadIdtr]
LoadIdtr:
	mov eax, [esp+4]
	lidt [eax]
	ret
.end:

GLOBALLoadIdtr 函数声明为全局函数,告诉其他文件想要调用 LoadIdtr 就来这里查找。

(二) 函数定义在其他文件

[EXTERN printf]
main:
	call printf
	ret
.end

EXTERNprintf 函数声明为外部函数,表明 printf 函数代码不在本文件,要去别的文件查找。

猜你喜欢

转载自blog.csdn.net/weixin_36725931/article/details/85227445