《IBM-PC汇编语言程序设计》(第2版) 第3章 80x86的指令系统和寻址方式
其他
2020-04-09 01:20:32
阅读次数: 0
基础
|
|
|
EU |
通用寄存器 |
AX、BX、CX、DX |
|
|
SI、DI |
|
|
SP(栈顶地址)、BP(栈底地址) |
|
标志寄存器(9个标志位) |
SF(运算结果为负时,标志为1) |
|
|
ZF(运算结果为0时,标志为1) |
|
|
OF(运算时,操作数溢出时,标志为1) |
|
|
CF(运算时,最高位进位了,标志为1) |
|
|
PF(操作数中1的个数为偶时,标志为1) |
|
|
AF(运算时,第三位进位时,标志为1) |
|
|
DF(串处理时的方向标志) |
|
|
IF(中断开关) |
|
|
TF(单步调试,为1时每条指令执行后产生陷阱) |
|
ALU |
|
BIU |
段寄存器 |
CS(代码段)、DS(数据段)、ES(辅助段)、SS(堆栈段) |
|
指令寄存器 |
IP(包含下一条指令的地址) |
|
指令队列 |
|
-
高地址对应高字节(高高低低)。
-
物理地址 = 段地址 * 16 + 偏移地址。
-
CPU的两种模式:
- 实模式:8086以及之前的CPU、1M寻址、单任务、DOS系统。
- 保护模式:
- 物理地址 = 段选择子(16位) + 编译地址(32位)。
- 段选择子 = GDT(段描述表)索引。
- 段描述表 = 段描述符集合,全局可见。
- 段描述符 = 段地址 + 段大小 + 权限 + 其他。
-
汇编组成:
- 汇编指令:机器码助记符,不分大小写。
- 伪指令:编译器执行。
- 其他符号:编译器识别。
汇编指令
- mov 指令
作用:将src中的数据传输到dst中。
|
|
mov dst(mem\reg) src(mem\reg\data) |
两边不能都为mem |
movsx dst(mem\reg) src(mem\reg\data) |
两边不能都为mem |
movzx dst(mem\reg) src(mem\reg\data) |
两边不能都为mem |
|
|
push src |
src进栈,sp-2(16位),sp-4(32位) |
pop dst |
出栈, sp+2(16位),sp+4(32位) |
xchg a b |
a b交换,必须有一个是寄存器 |
- in、out、xlat 指令
in、out用于在cpu和ios之间传输数据的,io端口号为0-65535,0-255可以直接写数字,大于255的必须通过dx传递。
|
|
in al 端口号 |
从端口读取1字节的数据到al中 |
out 端口号 al |
发送al中的数据到端口中 |
xlat |
把DX + BX + AL的地址中的内容送入AL中 |
|
|
lea 目标寄存器 [内存地址]/[寄存器] |
把偏移地址放入目标寄存器中 |
lds 目标寄存器 [内存地址]/[寄存器] |
把地址存的内容的高16位放入DS中,低16位放入目标寄存器中 |
les 目标寄存器 [内存地址]/[寄存器] |
把地址存的内容的高16位放入ES中,低16位放入目标寄存器中 |
lfs 目标寄存器 [内存地址]/[寄存器] |
把地址存的内容的高16位放入FS中,低16位放入目标寄存器中 |
lgs 目标寄存器 [内存地址]/[寄存器] |
把地址存的内容的高16位放入GS中,低16位放入目标寄存器中 |
lss 目标寄存器 [内存地址]/[寄存器] |
把地址存的内容的高16位放入SS中,低16位放入目标寄存器中 |
|
|
lahf |
标志进入AH中 |
sahf |
AH进入标志中 |
pushf |
标志进栈 |
popf |
标志出栈 |
|
|
cbw |
将AL扩展到AH中,高位为0则扩展全为0,高位为1则扩展全为1,AL部分不变 |
cwd |
将AX扩展到DX中,高位为0则扩展全为0,高位为1则扩展全为1,AX部分不变 |
cdq |
将EAX扩展到EDX中,其他同上 |
bswap 寄存器 |
寄存器中的内容按字节反转 |
|
|
add dst src |
src + dst 赋值到dst中 |
adc dst src |
src + dst + cf 赋值到dst中 |
inc dst |
加1 |
xadd dst src |
把src+dst赋值到dst中 ,把dst原来的值赋值到src中 |
|
|
sub dst src |
dst = dst - src |
sbb dst src |
dst = dst - src - cf |
dec dst |
减1 |
neg dst |
求补 |
cmp dst src |
比较dst和src,如果相等则zf=1,如果小于则cf=1 |
cmpxchg dst src |
比较dst和src且交换,如果相等则zf=1,如果小于则cf=1 |
cmpxchg8b dst src |
比较dst和src且交换8字节,如果相等则zf=1,如果小于则cf=1 |
|
|
|
|
mul src |
无符号乘法 |
al * src -> ax |
src为8位 |
|
|
ax * src -> dx ax |
src为16位 |
|
|
eax * src -> edx eax |
src为32位 |
imul src |
有符号乘法 |
|
|
|
|
|
div src |
无符号除法 |
ax / src 商->al,余数->ah |
idiv src |
有符号除法 |
|
|
|
and dst, src |
dst 与运算 src -> dst |
or dst, src |
dst 或运算 src -> dst |
not opr |
opr 取反 -> opr |
xor dst, src |
dst 异或 src -> dst |
test opr1, opr2 |
opr1 与 opr2 -> 标志寄存器 |
发布了41 篇原创文章 ·
获赞 4 ·
访问量 3906
转载自blog.csdn.net/weixin_42487874/article/details/102981910