汇编语言总结
1、基础知识
寄存器CPU存储地址信息
物理地址 = 基础地址 + 偏移地址
基础地址 = 段地址 * 16(10H)
段地址:偏移地址
ds si
es di
ss bp
cs ip
sp
bx
CS:IP 所指向的内存地址都是指令
指令执行的过程:
1、CPU从cs:ip所组成的地址中读取指令,将这个指令存放到指令缓存器中
2、IP = IP + 所读指令的字节数
3、执行指令缓存器中的内容,回到步骤1,重复这个过程
转移指令
能够修改IP或者CS 或者同时修改的指令
jmp 2000:0
jmp 寄存器
r 查看寄存器
d 查看段地址:偏移地址
u 查看CS:IP后的指令
a 段地址:偏移地址
e 段地址:偏移地址
t 执行CS:IP指向的指令
p 执行完成 程序返回
g 地址 跳到指定的地址,地址之前将执行
题目
debug实验
1、使用debug,将下列程序写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的变化
mov ax,4E20H ax=4E20H
add ax,1416H ax=6236H
mov bx,2000H bx=2000H
add ax,bx ax=8236H
mov bx,ax bx=8236H
add ax,bx ax=046CH
mov ax,001AH ax=001AH
mov bx,0026H bx=0026H
add al,bl ax=0040H
add ah,bl ax=2640H
add bh,al bx=4026H
mov ah,0 ax=0040H
add al,bl ax=0066H
add al,9CH ax=0002H
2,将下列3条指令写入从2000:0 开始的内存单元中,利用这3条指令计算2的8次方
move ax,1
add ax,ax
jmp 2000:3
答案:
先将cs:ip 变成2000:0
然后运行上面这三条指令,add ax,ax运行八次就是2的8次方
移动指令
mov 寄存器,数据 mov ax,10H
mov 寄存器,寄存器 mov ax,bx
mov 寄存器,内存单元 mov ax,ds:[0]
mov 内存单元,寄存器 mov ds:[0],ax
mov 段寄存器,寄存器 mov ds,1000H -> mov ds,bx
mov 寄存器,段寄存器 mov bx,ds
运算指令
add 寄存器,数据 add ax,1
add 寄存器,寄存器 add ax,bx
add 寄存器,内存单元 add ax,ds:[0]
add 内存单元,寄存器 add ds:[0],ax
sub 寄存器,数据 sub ax,1
sub 寄存器,寄存器 sub ax,bx
sub 寄存器,内存单元 sub ax,ds:[0]
sub 内存单元,寄存器 sub ds:[0],ax
栈
是一段连续的内存空间,也就是连续的内存地址
2种特殊的访问方式
段地址:偏移地址
ss sp
入栈 push 字型数据 -> 数据从哪里来
出栈 pop 字型数据 -> 数据取出到哪里
push -> sp - 2 -> 将从哪里来的字型数据存放到ss:sp
pop -> ss:sp字型数据拿出来哪里 -> sp+2
安全的内存写入 0:200H~0:2FFH是安全的
保护模式 实模式
0:7E00H
[bx]和loop指令
ds:[bx] 访问数据
loop 循环指令 cx = cx - 1 判断cx是否等于0
or ax,bx
and ax,bx
ds:[bx+5] 偏移地址的组合
取 ds:[bx+si]
存 es:[bx+di]
ds:[bx+si+4]
es:[bx+di+4]
ss:[bp]
ss[bp+si+2]
mov word ptr ds:[0],1122
mov byte ptr ds:[0],11
除法div
1,除数: 8bit 16bit 在内存单元中 或者 寄存器中
2,被除数 AX或者 AX和DX中
如果除数为8bit,被除数则为16bit,存放在AX中
如果除数为16bit,被除数则为32bit,AX存放低16bit,DX存放高16bit
3,结果: 如果除数为8bit,则AL存商,AH存放余数
如果除数为16bit,则AX存放商,DX存放余数
div bx/bl
100001/100
AX = 86A1H, DX = 1H , BX = 64H
div bx
AX = 3E8, DX = 1
1001/100
AX = 3E9, BL = 64H
div bl
AX = 010A
db 占一个字节
dw 占两个字节
dd 占四个字节
cnt dup 重复cnt次
jmp word ptr ds:[0]
jmp dword ptr ds:[0]
条件转移指令
jcxz 标号
当cx等于0时
B800:0 开始显示屏幕字符,一行80个,160字节
有25行
偶数为ASCLL码,奇数修改前面存放的颜色
7 6 5 4 3 2 1 0
7号位置闪烁
6号位置R = red 背景
5号位置g = green 背景
4号位置R = bule 背景
3号位置高亮
2号位置r = red 前景
1号位置g = green 前景
0号位置b = bule 前景
CALL和RET指令
call 将ip存起来
ret 近转移 IP
retf 段间转移 它修改CS和IP
cal -> push ip
cal far ptr s -> push ip push cs
ret -> pop ip
retf -> pop ip, pop cs
call word ptr ds:[0]
call dword ptr ds:[0] push cs, push ip
mul al ah ax,dx
标志寄存器
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
标志 真 假
OF OV NV OV = 溢出
SF NG PL NG = 负数 PL = 正数
ZF ZR NZ ZR = Zero NZ = not Zero
PF PE PO PE = 1是偶数(Even) odd奇数
CF CY NC CY = Carry Yes (进位)
DF DN UP
adc 32加法 ax低16bit dx高16bit
abb 32减法 ax低16bit dx高16bit
cmp ax,bx 修改标志位
ax = bx zf = 1
ax != bx zf = 0
ax < bx cf = 1
ax > bx cf = 0 并且 zf = 0