汇编-学习笔记

div 指令 除法指令
除数 有8位和16位 在一个寄存器或内存单元中
2 被除数 默认在(ax)或(dx+ax)中 除数为8,被除数则为16位 默认在ax中
如果除数为16位,被除数则为32位,在DX和AX中存放,DX存高16位,AX存低16位
结果 如除数为8位,AL存除法的商,AH存除法的余数,如果为16 ,则AX存除法的商,DX存除法的余数
div byte ptr ds:[bx] ==ax/ds:[bx] 商在al中余数在ah中
div [bx] 等同于 dx*10000+ax/ds:[bx] 16位运算 商在ax中余数在dx中
div bx ==dx*10000+ax/bx 16位运算 商在ax 余数在dx
div bl == ax/bl 8位运算,商在al中余数ah中

db 定义一个字节 8位
dw 定义一个字,一个字点两个字节,16位
DD 定义二个字,四个字节,32位

程序的段地址
如果 ds=0b3d cs=0b4e 程序的段地址=SA+10 sa 为ds的地址,所有段地址为 0b3d+10H=0b4d

dup 伪指令 配合db dw dd使用 用于定义重复的数据
db 3 dup (0) 定义三个0 == db 0,0,0
db 2 dup (ab,AB) == db 'abABabAB'


取地址寄存器 bx+(si,di) bp+(si,di)
在[……]如果出现了si则不能出现di 如果出现了bx则不能出现bp
如果在[……]中出现了bp 而没有显性的给出段地址,则段地址默认在ss中
如果在[……]中出现了bx 而没有显性的给出段地址,则段地址默认在ds中

and 指令 逻辑与指令 按位进行与运算
and al,00111011B
主要用与相应位设0其他不变
or 指令 逻辑或指令 按位进行或运算
or al,00111011B
主要用与相应位设1其他不变

通过 X ptr 指明内存单元长度
mov word ptr ds:[0],1
把1放入 ds:[0]和ds:[1]内存中 word ptr定义一个字的内存空间占两个字节
mov byte ptr ds:[0],1
把1放入 ds:[0]内存中 byte ptr定义一个字节的内存空间占一个字节


可以修改IP或同时修改CS和IP的指令统称为转移指令(可以控制CPU执行内存中某处的代码的指令)
只修改IP 称为段内转移 jmp ax
同时修改CS/IP时 称为段 间转移 jmp 1000:0
当转移指令修改IP的范围在-128-127之间时称为短转移
当转移指令修改IP的范围在-32768-32767之间时称为短转移
转移指令分为
无条件转移指令(jmp)条件转移指令 循环指令(loop) 过程 中断

伪指令offset 功能是取得标号的偏移地址
如 start : mov ax,offset start   (取得start的偏移地址)

CPU执行指令过程
从CS:IP指向的内存单元读取指令,读取的指令进行指令缓冲器
(IP)=(ip)+所读取指令的长度(使IP指向下一条指令)
执行指令

依据位移进行转移
jmp short 标号(短转移)功能为 (IP)=(IP)+8位 位移(short是八位位移最大127最小-128)
jmp near ptr 标号 功能为 (ip)=(ip)+16位 位移 (段内近转移 十六位位移 最大32767 最小-32768)

jmp far ptr 标号 实现段间转移,又称为远转移
jmp far ptr s 用s标号的段地址修改CS s标号的偏移地址修改IP

jmp 16位寄存器 用存器中的值放入IP中


jmp word ptr 内存单元地址 如 1000:0 0b 2b 指令 jmp word ptr 1000:0 则跳转到 2b 0b处
也可以通过 jmp word ptr ds:[dx] 或 jmp word ptr [dx] 等方式

jmp dword ptr 内存单元地址 在内存单元地址处存两个字,高字节为段地址 低字节为偏移地址
如 1000:0 0b 0c 1b 2b 执行 jmp dword ptr 1000:0 则跳转到 1b2b: 0b0c 处


seg 标号 用于取得标号处的cs/ip

call ret
reg 用栈中的数据修改ip内容,实现近转移
retf 用栈中的数据修改cs/ip实现远转移

call不能实现短转移

call 标号 将当前的IP压栈后,转到标号处执行
执行 call s 相当于执行 push ip jmp near ptr
位移范围在 -32768-32767 之间

call far ptr 标号 实现段间转移
等同于指令 push cs     push ip     jmp far ptr 标号
段间转移 内存中包令CS/IP地址


call 16寄存器 如call ax          call bx


call word ptr 内存单元地址
等同于 push ip     jmp word ptr 内存单元地址


ret 指令 实现从ss:sp处取出地址,并转到这个地址
执行ret 等同于 pop ip

retf 指令 实现从ss:sp处取出两个字节的数据 低字节传给ip 高字节传给cs
执行retf 等同于 pop ip    pop cs

call 相当于ret的反操作,他是先把当前的ip或cs/ip压入栈中,再进行转移,
call不能实现短转移
语法 call 标号
先把IP压入栈中再转移到标号处执行
相当于执行 push IP jmp near ptr 标号


call far ptr 实现段间转移
先把cs压入栈中再把ip压入栈中再进行转移
相当于执行 push cs    push ip jmp far ptr 标号

call 16位寄存器
如 call ax 相当于执行 push ip    jmp ax

call word ptr 内存单元地址
push ip   jmp word ptr 内存地址


call dword ptr 内存单元地址
push cs push ip jmp dword ptr 内存地址

mul 指令 乘法指令 相乘的两个数必须位数相同 同为8位或16位
如果都是8位 一个默认在ah中 另一个放在8位寄存器或内存字节单元中,如果是16位,一个默认在AX中,
另一个放在16位寄存器或内存字单元中
8位乘法结果默认在AX中,16位乘法结果,默认 高位在DX中低位在AX中

寄存器
ax bx cx dx si di bp sp ip cs ss ds es
标志寄存器
标志寄存器共16位
0 CF   2 PF  
4 AF   6 ZF
7 SF   8 TF
9 IF   10 DF
11 OF

1、3、5、12、13、14、15在8086CPU中没有使用,不具有任何含义。

ZF (zero flag)零标志位 记录相关指令执行后结果 是否为0
如果结果为0 ZF=1 如果结果不为0 那么 ZF=0

PF 标志(parity flag)奇偶标志位 它记录相关指令执行后,其结果的所有二进
制位中1的个数是否为偶数 如果1的个数为偶数 则PF=1 如果为奇数 PF=0
比如运算结果为 011 或 101 或 10001 或 1111 中的1的个数为偶数 PF=1
如果结果 为 001, 1011 、11111 等1的个数为奇数 所有PF=0
这个标志是记录 二进制中 1 的个数 为奇还是为偶的

SF 标志 (symbol flag) 符号标志位 记录指令执行后结果是否为负 如果结果
为负 SF=1 如果非负 SF=0
比如 -127 的二进制为 1000 0001B
执行 mov al,10000001B add al,1 后 结果为 1000 0010B SF=1 代表 指令进行
的是有符号运算 结果为负

CF 标志(carry flag) 进位标志位 CF 只用于无符号数的运算 在进行无符号数运算的时候,它记录的运算结果的最高有效位 向更高位的进位值 , 或从更高位的借位值,比如 99H+98H 的结果为131H,其结果在八位寄存器中无法存储则产生了进位,CF就是标志是否产生了进位,如产生进位CF为1, 又如97H-98H 则产生借位,CF标志也是为1

OF 标志 (overflow flag)溢出标志 用于有符号数的运算 如 有符号数 98+99 则产成生了溢出 它大于有符号数的表示范围-128~127 所以产生溢出但不产生进位

adc指令 带进位加法指令 它利用CF位上记录的进位值
adc 操作对象1,操作对象2
功能 操作对象1 = 操作对象2+操作对象2+CF
如adc ax,bx 实现功能是 ax=ax+bx+CF
mov ax,2   mov bx,1    sub bx,ax     adc ax,1
相当于计算 bx=bx-ax    ax+bx+CF = 2+1+1=4
bx-ax 进bx<ax产生借位 CF=1 bx为1 所以 ax+bx+cf=4

sbb指令 带借位减法指令 它利用了CF位上记录的借位值
sbb 操作对象1,操作对象2
功能 操作对象1=操作对象1-操作对象2-CF
同adc 差不多
例 3c02 1020H-20 3402H
mov ax,1020
mov bx,3c02
sub ax,3402
sbb 20

cmp 指令 比较指令(s相当于减指令,但不保存结果,只对标志寄存器产生影响)
cmp 操作对象1,操作对象2
如 指令 cmp ax,ax 相当于做 ax-ax运算,结果为0 但不保存,只影响标志寄存器
语句执行后 ZF=1 PF=1 SF=0 CF=0 OF=0
cmp ax,bx
如果 ax=bx 则ax-bx=0 所以ZF=1
ax<>bx 则ZF=0 ax<bx 产生借位 CF=1   ax>=bx 不用借位 CF=0
ax>bx 则 ax-bx 不用借位,结果也不为0 所以 CF=0&&ZF=0
我们可以通过不同的标志位来却定两个数之间的大小


检测比较结果的条件转移指令
je a=b等于则转移 ZF=1
jne a!=b不等于则转移 ZF=0
jb a<b低于则转移   CF=1
jnb a>=b不低于则转移 CF=0
ja       a>b高于则转移    CF=0 且ZF=0
jna a<=b不高于则转移   CF=1 或ZF=1


DF标志 flag的第十位是 DF(方向标志位) 在串处理指令中,控制每次操作后 si,di的增减
DF=0 每次操作后 si,di递增 DF=1 每次操作后SI,DI递减

串传送指令
movsb 传送一个字节
执行movsb指令相当于进行 es*16+di=ds*16+si 如DF=0 si=si+1 di=di+1 如DF=1 则si=si-1 di=di-1

movsw 传送一个字
同movsb差不多,只是 每次加或减二 si=si-2 或 si=si+2

一般传送指令和rep配合使用
rep movsb 等同于 s:movsb loop  
由此可见rep movsb 可以实现CX个字符的传送

cld 指令,将标志器DF 置0
std 指令,将标志器DF 置1

rep movsb 传送原始位置 ds:si 目的位置 es:di 传送长度 cx 传送方向 DF

pushf指令 将标示寄存器的值压栈
popf 指令 将栈中的数据弹出,送入标志寄存器

标志寄存器在debug中的表示
值为1         值为0
OF      OV               NV
SF      NG               PL
ZF      ZR               NZ
PF      PE               PO
CF      CY               NC
DF      DN               UP


cpu的中断类型
除法错误0 单步执行1 执行int0指令4 执行int指令

中断向量表
从0000:0000到0000:03E8 共1000个单元存放中断向量表,中断向量表只能存放在这里,不能存到别处
一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址

cpu的中断处理过程

1 从中断信息中取得中断类型码
2 标志寄存器的值入栈
3 设置标志寄存器的第8位TF和第9位IF的值为0
4 CS入栈
5 IP入栈
6 从内在地址为 中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置CS/IP

iret 指令 用于调用完中断全程后,把地址重设
iret相当于执行 (pop IP pop CS popf)
当调用中断时,中断会自动把标志寄存器,CS/IP的值压入栈中,执行完中断例程必段用iret恢复CS/IP以及标志寄存器的值

int 中断
int n (n为中断类型码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值