《IBM-PC汇编语言程序设计》(第2版) 第3章 80x86的指令系统和寻址方式

基础

  • CPU内部
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、pop、xchg指令
    作用:操作堆栈。
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