汇编语言笔记

简介

本学期选了汇编语言这门选修课,我认为还是有很大的学习价值的,虽然学习的还是年代久远的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
0%