1.进入debug模式
r
查看
2. mov指令测试
指令以CS:IP
格式进行读取,后跟8086 asm实际指令:
可以看到,当我们再次“唤醒” CS:IP
时,光标停留在上次指令结束的地方。
IP
偏移,不知道这么说对不对,每次改变为“ 2 ”。
测试代码如下:
; 设置当前 AX=0008,BX=0008,IP=0107
mov ah,13
mov bl,13
; 输出为上图:
; AX=1308,BX=0013,IP=010B
3. add指令测试
; 测试 add 指令
add ax,3
add bx,ax
add cx,bx
4. sub指令测试
小tips:超出四位,或者超出两位,都会直接舍掉。 进行计算验证的时候,可以使用计算器程序员模式来进行检验,这个macOS 和 Windows下都有。
; 测试sub指令操作两个寄存器相减
sub ax,bx
5. 关于越界以下进行说明:
多余进位会直接舍掉,这里bl
就是这个道理,计算结果为F2
。
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. 段(未完)
执行前3条指令:
- ax=1000
- ss=1000
- sp=0020
执行后2条指令:
- ax=0DAB (cs=0DAB)
- ds=0DAB
然后:
mov ax,[0] ; [0]处的字型数据送入ax
; ah=20
; al=CD
总之,段是我们自己定义的。一个段可以是数据段DS,也可以是栈段SS。
DS | 数据段寄存器 | Data Segment Register | 存储数据段的起始地址 |
---|---|---|---|
SS | 堆栈段寄存器 | Stack Segment Register | 存储堆栈段的起始地址 |
原文发于我的微信公众号《labspc》:intel 8086 asm 基础1 https://mp.weixin.qq.com/s/HNnh-kLVML31FyZppoadWA
暂无评论