简介
本学期选了汇编语言这门选修课,我认为还是有很大的学习价值的,虽然学习的还是年代久远的8086CPU指令集,但对后续接触更多汇编语言还是有很大帮助,方便我们调试程序,多了一种查错的方式。
其实关于调试自己很久之前就想学了,高中的时候看紫书,发现lrj老师讲了一段的gdb调试方法,当时感觉一点都看不懂,现在借此机会学习一下gdb的调试。
本文除了将总结一些汇编语言学习过程中的笔记之外,还计划穿插一些cs213/CSAPP 的内容以及bomb lab的解析。
准备工作
dos系统现在以及年代久远,想使用8086CPU指令集调试的话需要借助DosBox来实现。
DosBox官网
由于macOS下没有DOSbox需要的调试工具,因此下载之后需要挂载debug.exe等Windows下的调试工具
在DOSbox中输入
1
2
3
|
mount C ~/dos
C:
debug
|
即可进入debug模式
实验1
前置知识
几条汇编指令
1
2
3
4
|
mov 目标操作对象,源操作数
add 目标操作对象,源操作数
jmp 寄存器 //修改IP寄存器的值
or
|
1
2
3
4
5
|
jmp CS:IP
eg: jmp ax == (let IP = ax)
jmp 2AE3:3 == let CS = 2AE3H and let IP = 0003H
sub ax,bx
ax = ax - bx
|
1
2
3
4
|
inc and dec
inc 操作对象
eg: inc ax == ax+=1
dec ax == ax-=1
|
注意:不可用mov指令修改段寄存器的值。(代码段寄存器CS,指令指针寄存器IP)
CPU中识别CS:IP
为执行指令
操作对象可以是寄存器,也可以是地址
Debug命令
1
2
3
4
5
6
|
r: 看查寄存器内容,或者修改寄存器内容
d: 看查内存内容
e: 改写内存内容
u: 将机器指令翻译为汇编指令
t: 执行下一条汇编指令
a: 写入汇编指令
|
编译指令
1
2
3
|
masm test
link test.obj
debug test.exe
|
lab1
1
2
3
4
5
6
7
8
|
MOV WORD PTR [1100],3445
MOV WORD PTR [1102],5678
MOV WORD PTR [1106],6732
MOV AX,[1100]
SUB AX,[1102]
ADD AX,[1106]
MOV [1104],AX
HLT //使CPU停止工作
|
1
2
3
4
5
6
7
8
9
10
11
12
|
MOV AX,1234
MOV [1000],AX
MOV BX,1002
MOV BYTE PTR[BX],20
MOV DL,39
INC BX
MOV [BX],DL
DEC DL
MOV SI,3
MOV [BX+SI],DL
MOV [BX+SI+1],DL
MOV WORD PTR[BX+SI+2],2846
|