intel 8086 asm 基础1

1.进入debug模式

截屏2024-03-20 15.08.24

r 查看

2. mov指令测试

指令以CS:IP 格式进行读取,后跟8086 asm实际指令:

截屏2024-03-20 15.12.43

可以看到,当我们再次“唤醒” CS:IP 时,光标停留在上次指令结束的地方。

截屏2024-03-20 15.16.04

IP 偏移,不知道这么说对不对,每次改变为“ 2 ”。

测试代码如下:

; 设置当前 AX=0008,BX=0008,IP=0107

mov ah,13
mov bl,13

; 输出为上图:
; AX=1308,BX=0013,IP=010B

3. add指令测试

截屏2024-03-20 15.25.18

; 测试 add 指令
add ax,3
add bx,ax
add cx,bx

截屏2024-03-20 15.27.05

4. sub指令测试

小tips:超出四位,或者超出两位,都会直接舍掉。 进行计算验证的时候,可以使用计算器程序员模式来进行检验,这个macOS 和 Windows下都有。

截屏2024-03-20 15.40.55

; 测试sub指令操作两个寄存器相减
sub ax,bx

5. 关于越界以下进行说明:

截屏2024-03-20 15.44.15

多余进位会直接舍掉,这里bl 就是这个道理,计算结果为F2

截屏2024-03-20 15.51.55

6. 小插曲: 在mac m1 上跑 docker brew🍺

现在是2024年,docker已经支持 AppleSilicon,可以直接 brew🍺就行:https://formulae.brew.sh/formula/docker

docker image地址:

https://hub.docker.com/r/jeremiedevelops/easy-masm

有个项目是在 mac m1上简单跑 masm,晚上试了下docker,好麻烦,不如 dosbox-x 来的直接。

7.寄存器表

通用寄存器、特殊用途寄存器和段寄存器的x86汇编寄存器对照表:

简写 中文名称 英文全称 说明
AX 累加器 Accumulator 16位通用寄存器
BX 基址寄存器 Base Register 16位通用寄存器
CX 计数器 Counter Register 16位通用寄存器
DX 数据寄存器 Data Register 16位通用寄存器
SI 源变址寄存器 Source Index Register 16位通用寄存器
DI 目的变址寄存器 Destination Index Register 16位通用寄存器
BP 基址指针寄存器 Base Pointer Register 16位通用寄存器
SP 堆栈指针寄存器 Stack Pointer Register 16位通用寄存器
AL 累加器的低8位 Accumulator Low 8位通用寄存器
AH 累加器的高8位 Accumulator High 8位通用寄存器
BL 基址寄存器的低8位 Base Low 8位通用寄存器
BH 基址寄存器的高8位 Base High 8位通用寄存器
CL 计数器的低8位 Counter Low 8位通用寄存器
CH 计数器的高8位 Counter High 8位通用寄存器
DL 数据寄存器的低8位 Data Low 8位通用寄存器
DH 数据寄存器的高8位 Data High 8位通用寄存器
EAX 扩展累加器 Extended Accumulator 32位通用寄存器
EBX 扩展基址寄存器 Extended Base 32位通用寄存器
ECX 扩展计数器 Extended Counter 32位通用寄存器
EDX 扩展数据寄存器 Extended Data 32位通用寄存器
ESI 扩展源变址寄存器 Extended Source Index 32位通用寄存器
EDI 扩展目的变址寄存器 Extended Destination Index 32位通用寄存器
EBP 扩展基址指针寄存器 Extended Base Pointer 32位通用寄存器
ESP 扩展堆栈指针寄存器 Extended Stack Pointer 32位通用寄存器
RAX 高位扩展累加器 Extended Accumulator 64位通用寄存器
RBX 高位扩展基址寄存器 Extended Base 64位通用寄存器
RCX 高位扩展计数器 Extended Counter 64位通用寄存器
RDX 高位扩展数据寄存器 Extended Data 64位通用寄存器
RSI 高位扩展源变址寄存器 Extended Source Index 64位通用寄存器
RDI 高位扩展目的变址寄存器 Extended Destination Index 64位通用寄存器
RBP 高位扩展基址指针寄存器 Extended Base Pointer 64位通用寄存器
RSP 高位扩展堆栈指针寄存器 Extended Stack Pointer 64位通用寄存器
RIP 指令指针寄存器 Instruction Pointer 存储当前执行指令的地址
FLAGS 标志寄存器 Flags Register 存储CPU的状态信息
CS 代码段寄存器 Code Segment Register 存储代码段的起始地址
DS 数据段寄存器 Data Segment Register 存储数据段的起始地址
SS 堆栈段寄存器 Stack Segment Register 存储堆栈段的起始地址
ES 附加段寄存器 Extra Segment Register 用于一般目的的附加数据段
FS 附加段寄存器 Extra Segment Register 用于一般目的的附加数据段
GS 附加段寄存器 Extra Segment Register 用于一般目的的附加数据段

这些寄存器在x86汇编语言编程中起着重要作用,用于存储数据、地址、指令、状态信息等。

8. 段(未完)

截屏2024-03-21 12.03.48

执行前3条指令:

  • ax=1000
  • ss=1000
  • sp=0020

截屏2024-03-21 12.05.49

执行后2条指令:

  • ax=0DAB (cs=0DAB)
  • ds=0DAB

截屏2024-03-21 12.14.13

然后:

mov ax,[0]         ; [0]处的字型数据送入ax
; ah=20
; al=CD

截屏2024-03-21 12.18.58

总之,段是我们自己定义的。一个段可以是数据段DS,也可以是栈段SS。

DS 数据段寄存器 Data Segment Register 存储数据段的起始地址
SS 堆栈段寄存器 Stack Segment Register 存储堆栈段的起始地址

原文发于我的微信公众号《labspc》:intel 8086 asm 基础1 https://mp.weixin.qq.com/s/HNnh-kLVML31FyZppoadWA

相关推荐

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。