2018-12-23 汇编学习笔记

本文深入解析CPU寄存器如累加器ax、eax、rax的功能与系统位数的关系,指令寄存器IR与程序计数器PC的作用,以及pusha、popa和iret指令的工作原理。同时,探讨了函数内外链接机制,包括函数定义和外部函数调用的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

以累加寄存器为例,在 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 函数代码不在本文件,要去别的文件查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值