1、debug 调试工具
参数:
-r 显示所有寄存器状态,可以修改寄存器内容(形如-r ax)
-d 显示从当前cs:ip位置之后的128个字节,可以指定地址打印(形如: -d 段地址:偏移地址)
-u 将cs:ip位置后续的字节翻译成汇编指令,可以制定地址翻译(形如: -u 段地址:偏移地址)
-a 在当前cs:ip位置处写指令,可以制定地址(形如: -a 段地址:偏移地址)
-t 执行当前cs:ip所指向的指令
-p 将当前循环体执行结束
-e 段地址:偏移地址 修改指定位置处开始后续的字节
-g 偏移地址 从cs:ip位置处开始,执行指令到指定位置处
2、
Byte = 8bit (字节型数据) => 一个内存地址就能保存一个字节
Word = 2Byte = 16bit (字型数据) => 一个字需要2个连续的内存单元来存放 高位地址存放高位字节 低位地址存放低位字节
3、寄存器
段地址 : 偏移地址
ds si
es di
ss bp
cs ip
sp
bx
cs:ip 所指向的内容为指令
ds:[0] 所指向的内容为数据(也可以为采用显式的表达方式: ds:[bx]等)
ds:[si] 数据从哪里来,一般的默认组合,也可以是ds:[bx+si+2]、ds:[bx+di]等
es:[di] 数据放到哪里去,同上
ss:sp 指向栈的栈顶数据,栈是以字为单位存放数据的
bx默认和ds是一对,ds:[bx]
bp默认是和ss是一对,ss:[bp]
4、指令执行的过程
<1> CPU从cs:ip所组成的地址中读取指令,将这个指令放到指令缓存器中
<2> IP = IP + 所读指令的字节数
<3> 执行指令缓存器中的内容,回到<1>继续执行
5、push、pop
push sp - 2,将指定的数据放到ss:sp所指向的内存空间
pop 将ss:sp处的数据弹出到指定位置,pop + 2
6、loop
loop s s 位标号
loop 条件转移指令(短转移),运行到loop指令时,cx -= 1,如果 cx == 0 循环结束,否则跳转到标号处继续执行
cx 存放循环的次数
7、数据不能以字母开头,如:FFFFH需要写成0FFFFH
8、安全的内存
0:200H ~ 0:2FFH 256个字节
0:7E00H之后
9、内存的分配是按16字节的倍数分配的
10、
db(define byte) 定义字节型数据,占1个字节
dw(define word) 定义字型数据,占2个字节
dd(define double) 定义双字型数据,占4个字节
11、定义data segment和stack segment后,数据和栈存放的内存与指令存放的内存相邻(不足16字节要补齐),即与cs:ip位置相邻,但是ds和ss还需要人为设置
12、大小写转换问题
字符 ASCII码 二进制形式
A 41H 0100 0001B
B 42H 0100 0010B
C 43H 0100 0011B
a 61H 0110 0001B
b 62H 0110 0010B
c 63H 0110 0011B
大写 –> 小写 or 0010 0000B
小写 –> 大写 and 1101 1111B
小写 or 0010 0000B = 小写
大写 and 1101 1111B = 大写
13、
//以字的形式处理数据
mov word ptr ds:[0],1
//以字节的形式处理数据
mov byte ptr ds:[0],1
//以双字型的形式处理数据
mov dword ptr ds:[0],1
14、div
<1>除数 8bit或者16bit,存放在内存单元或者寄存器(一般bl/bx)中
<2>被除数 AX或者 AX和DX中
如果除数为8bit,被除数则为16bit,存放在AX中
如果除数为16bit,被除数则为32bit