汇编语言总结

时间:2022-09-12 01:10:07

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