汇编知识点总结

5.5 算术运算指令:
操作数类型:无符号整数,带符号整数,组合BCD码,非组合BCD码
指令对标志位的影响
乘除法指令中操作数的存放位置
对无符号数和带符号数,加减法指令采用同一套指令,
需注意:参加的操作数必须都是无符号数或者都是带符号数。
需使用不同的标志位来检查无符号数和带符号数的运算结果是否溢出
CF : Carry 进位 Flag 标志
OF:Overflow 溢出
PF: Parity 奇偶标志 低八位包含偶数个1
AF:Auxiliary Carry Flag 辅助/借位进位 如果第三位向第四位借位或者进位,AF = 1;
SF:Sign 符号标志 运算结果最高位为1
ZF:Zero 零标准 运算结果为0

1.ADD(addition) 不带进位的加法指令
ADD dest, src
dest = dest + src
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:dest 和 src 不能同时为存储器操作数或者段寄存器。
ADC , SUB, SBB, CMP, AND,OR ,XOR 等指令对寻址方式的要求相同。
2.ADC(addition with carry) 带进位的加法指令
ADC dest,src
dest = dest + src + CF
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:ADC指令主要用于多字节数据相加。
3.INC dest
dest += 1
受影响的状态标志位:OF,SF,ZF,AF,PF
说明:INC 指令不影响CF

5.5.2 减法运算指令
1.SUB(subtract) 不带借位的减法指令
SUB dest,src
dest = dest - src
受影响的状态标志位:OF,SF,ZF,AF,PF,CF

2.SBB(subtract with borrow) 带借位的减法指令
SBB dest,src
dest = dest - src - CF
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:SBB指令主要用于多字节数据减法

3.DEC(decrement by one) 减1指令
DEC dest
dest -= 1
受影响的状态标志位:OF,SF,ZF,AF,PF
说明:DEC 指令不影响CF
e.g: DEC BYTE PTR[BX + SI + 1000H]

4.NEG(negate)取补(取负)指令
NEG dest
dest = 0 - dest
受影响的状态标志位:OF,SF,ZF,AF,PF,CF

5.CMP(compare)比较指令
CMP dest,src
dest - src 不返回值,但是对于状态标志位的影响与SUB 指令一样
受影响的状态标志位:OF,SF,ZF,AF,PF,CF

5.5.3乘法运算指令
1.MUL 无符号数的乘法指令
MUL src
src 是字节数据,就与AL中的数据相乘,乘积为字,存放在AX中。
AX <- AL * (src)
src 是字数据,就与AX中的数相乘,乘积为双字,存放在DX和AX中。
DX,AX<-AX*(src)
受影响的状态标志位:OF,CF
说明:源操作数src不能是立即数。
如果乘积的高半部不为零时,CF和OF被置位,否则将被清除

2.IMUL 带符号数的乘法指令
IMUL src
src 是字节数据,就与AL中的数相乘,乘积为字,存放在AX中。
AX<-AL * src
src 是字数据, 那么就与 AX 数相乘,乘积为双字,存放在DX和AX中。
DX,AX<-AX* src
受影响的状态标志位:OF,CF。
说明:src 不能是立即数。IMUL 指令视操作数为带符号数。如果乘积的高半部不是
符号位的扩展时,CF和OF被置位,否则将被清除。

5.5.4 除法运算指令
1.DIV(division,unsigned)无符号数的除法指令
DIV src
字除以字节:AX/src; AL <- 商,AH <-余数
双字除以字:DX,AX/src; AX <- 商, DX<-余数
受影响的状态标志位:不产生有效的状态标志。
说明:src不能是立即数;如果商数超过了允许的最大值(字节时为0FFH,
字时为0FFFFH)时就产生一个方式0的中断,并且商和余数都不确定

2.IDIV (division,signed)带符号数的除法指令
IDIV src
字除以字节:AX/src; AL <- 商,AH <-余数
双字除以字:DX,AX/src; AX <- 商, DX<-余数
受影响的状态标志位:不产生有效的状态标志。
说明:src不能是立即数;如果商数超过了允许的最大值(字节时为-128~127,
字时为-32768~32767)时就产生一个方式0的中断,并且商和余数都不确定。

字节/字转换为字/双字(无符号数)
无符号:
字节转换为字(AL-> AX): MOV AH,0
字转换为双字(AX->DX:AX): MOV DX,0
带符号:
字节转换为字(AL-> AX): 正数:MOV AH,0
负数:MOV AH,0FFH
字转换为双字(AX->DX:AX): 正数:MOV DX,0
负数:MOV DX,0FFFFH

CBW(convert byte to word)(将字节转换为字的指令)
指令汇编格式:CBW
操作:将AL中第七位的值扩展到整个AH中。
如果AL为正,那么AH <- 00H
否则 AH <-0FFH
受影响的状态标志位:没有
说明:CBW 是将AL寄存器中数的符号位扩展到整个AH寄存器中

CWD (convert word to double word)将字转换为双字的指令
指令汇编格式:CWD
操作:将AX中第七位的值扩展到整个DX中。
如果AX为正,那么DX <- 00H
否则 DX <-0FFH
受影响的状态标志位:没有
说明:CWD 是将AX寄存器中数的符号位扩展到整个DX寄存器中

5.6逻辑操作指令:
1.NOT 取反
NOT dest
将操作数的每一位求反,然后将结果回送到对应位中,可以是8位,16位寄存器或
存储器操作数
dest = -dest
受影响的状态标志位:没有
说明:NOT 指令常用来将某个数据取成反码,再加上1得到补码。
2.AND 逻辑与
AND dest,src
dest = dest &(src), CF = 0, OF = 0;
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:AND 指令可借助某个给定的操作数将另一个操作数中的某些位清零
(这种操作也称为设置屏蔽),某些位保持不变,这个数通常称为掩码。
e.g: AND AL,0FH
3.OR 逻辑或
OR dest,src
dest = dest | src , CF = 0, OF = 0
受影响的状态标志位:OF ,SF,ZF,AF,PF,CF
e.g:
OR AL,0FH

4.XOR 异或
XOR dest,src
dest←(dest)^(src), CF = 0, OF = 0
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:XOR 指令可用来使操作数中的某些位取反,某些位不变。
XOR AL,0FH
XOR AX,AX

5.TEST 测试
TEST dest,src
操作:将两个操作数进行逻辑“与”,根据结果设置状态标志位,但不改变两个操作数
的原始值,并将CF和OF清除。
dest & src,CF = 0,OF = 0;
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:TEST 指令通过“与”的方式对两个源操作数进行比较,但不保留“与”的结果

5.7 移位操作指令
非循环位移指令:
逻辑移位(SHL,SHR) SH 逻辑
算术移位(SAL,SAR) SA 算术
循环位移指令:
不带进位循环位移(ROL,ROR) RO不带进位
带进位循环位移(RCL,RCR) RC带进位

1.逻辑位移指令 dest,cnt
dest 可以是8位或者16位的寄存器或者存储器操作数。
cnt 为移位次数。
移位操作是将目标操作数移动cnt次。
cnt 可以为1 ,超过1位必须用CL存放移动次数
执行移位指令时,一位一位移,如果过程中源操作数的最高位(符号位)曾经发生改变,
那么OF就被置1,否则,OF就被置0.左移时,最高位送入CF,CF的值总是最后一次被移入的值

非循环位移指令和计组的移位方式相同
SHL/SAL,SHR,SAR影响CF, OF,PF,SF,ZF.
ROL,ROR,RCL,RCR 仅影响 CF 和 OF 位

5.8状态标志位操作指令
8086、8088有7条状态标志位控制指令,它们可以直接和独立地对8086CPU中的某一
状态进行控制,用来设置或改变状态标志位的状态
清0 置1 取反
CF CLC STC CMC
DF CLD STD
IF CLI STI

5.9 简单的I/O功能调用
1.INT 3
功能:停止程序运行,返回DEBUG

DOS 不仅为用户提供了许多使用的命令,还提供了
上百个常用子程序。对这些子程序的调用,称为系统功能调用
(实际是中断指令INT 21H)
1.单字符键盘输入 ----1号
功能:从键盘上接收一个字符,并在屏幕上显示出来
MOV AH,1
INT 21H
2.单字符显示器输出----2号
功能:在屏幕上光标处显示一个字符
入口条件:要显示的字符的ASCLL码在DL中
出口条件:无

MOV AH,2
MOV DL,‘A’
INT 21H

3.程序结束退出----4CH号
功能:结束程序运行,返回操作系统
入口条件:AL = 返回码(返回给父进程的代码)
调用方法: MOV AX,4C00H
INT 21H

4.多字符输入-0AH 号
功能:多个字符串输入到缓冲区,以回车结束
入口条件:DS:DX = 输入缓冲区首地址
出口条件:DS:DX = 输入字符串所在缓冲区首地址
注意:
-缓冲区第一个字节存放预定字符个数,最多255个
-缓冲区第二字节保留,用于调用返回时存放实际
输入的字符个数
-缓冲区第三个字节开始,存放输入的字符
-缓冲区要考虑留1个字节作为回车符

5.多字符输出 - 9号
功能:多个字符输出到屏幕显示
入口条件:DS:DX = 输出字符缓冲区首地址
注意:
该功能对输出字符的个数没有要求,但输出字符串要以$结束

6.分支结构程序
6.2.1:无条件转移指令
指令汇编格式:JMP targ
操作:
段内转移:IP<-目标的偏移地址
段间转移:IP<-目标的偏移地址
CS<-目标所处代码段的基址
受影响的状态标志位:无
说明:无条件转移指令可以转到内存中存放的任何程序段。
指令中的targ可以是直接标号,寄存器间接或寄存器间接寻址形式

目标地址寻址方式
段内直接转移方式
段内间接转移方式
段间直接转移方式
段间间接转移方式

目标IP = 当前IP + 相对位移量
相对位移量是一个8位或者16位的带符号数,
在机器指令中直接给出,汇编指令中的目标地址以标号的形式给出
JMP NEAR PTR 目标地址
目标地址在当前代码段,且在-32768~32767之间
JMP SHORT 目标地址
目标地址在当前代码段,且在-128~127范围内

段内间接转移方式
1)段内寄存器间接转移
JMP AX
2)段内存储器间接转移
JMP SI
JMP WORD PTR [BX+DI+1000H]

段间直接转移方式
汇编后的机器指令中直接给出目标地址的CS和IP,汇编
指令以标号的形式给出
段间间接转移方式
IP 和 CS 的内容用内存中2个连续的字来替换,可以使用s
任意一种存储器寻址方式。

6.2.2条件转移指令
-条件转移指令是根据执行该指令前CPU中状态标志位的状态决定
程序执行的流程。
-条件转移指令是以对不同的状态标志位的测试为条件。
如果条件成立,则程序转移到指令中所给出的转移目标执行。条件不成立,
程序将顺序执行。
-所有的条件转移指令都是相对转移形式的短(short)转移指令,
并且是在从下条指令算起的-128~127字节的地址范围内转移
-条件转移指令在比较完两个数的大小后根据比较的结果而决定是否转移,
对于某两个二进制数,把它们看成有符号数和无符号数,比较后会有不同的
结果,实际是测试不同的标志位。
-8086的条件转移指令中,大部分指令可以用两种不同的助记符来表示。
单条件转移指令
无符号数的条件转移指令
带符号数的条件转移指令
无符号数 带符号数
A < B JB CF = 1 JL (SF(异或)OF) = 1
A<= B JBE CF = 1 || ZF = 1 JLE ((SF(异或)OF)||ZF) = 1
A > B JA CF = 0 & ZF = 0 JG ((SF(异或)OF)&ZF) = 0
A>=B JAE CF = 0 JGE (SF(异或)OF) = 0
A = B JE (ZF = 1)
A != B JNE(ZF = 0)

(Below Above(无符号数)) (Less Great(带符号数)) Equal

基于单个标志位转移的指令
操作 指令汇编格式 条件
测试进位标志CF JC CF = 1
JNC CF = 0
检测零标志ZF JZ ZF = 1
JNZ ZF = 0
检测溢出标志 JO OF = 1
JNO OF = 0
检测符号标志 JS SF = 1
JNS SF = 0
检测奇偶标志 JP PF = 1
JNP PF = 0

第七章:循环结构程序
7.3 循环控制指令:所有的循环控制指令都是短转移指令,目标地址在-128~127之间
1.LOOP重复控制指令
指令汇编格式:LOOP目标地址
操作:计数器CX减1,然后判断,如果新的CX值不为0,则转向目标地址指定的循环
入口执行;若CX = 0,则退出循环,执行下一条指令。
受影响的状态标志位:没有
2.LOOPZ/LOOPE 条件重复控制指令
指令汇编格式:LOOPE/LOOPZ 目标地址操作:
计数存储器CX减1,然后判断,如果零标志位ZF=1且CX!=0时,转向目标地址指定的循环入口执行,
如果ZF = 0或者CX = 0 则执行后续指令。
受影响的状态标志位:没有
3.LOOPNZ/LOOPNE 条件重复控制指令
指令汇编格式:LOOPNE/LOOPNZ 目标地址
操作:计数寄存器CX减1,如果零状态标志位ZF=0且CX!=0时,转向目标地址指定循环入口执行,如果
ZF = 1 或 CX = 0 则执行后续指令。
受影响的状态标志位:没有
4.JCXZ CX为零转
指令汇编格式:JCXZ 目标地址
操作:如果CX为0,转向目标地址执行,
如果 CX!=0,则执行后续指令。
受影响的状态标志位:没有

7.4数据串操作指令
数据串:存储器中仅由字节或字组成的一组数据
字节串:由字节组成的数据串
字串:由字组成的数据串
数据串元素:组成数据串的字节或字
一个数据串最多可由64KB组成

1.MOVS/MOVSB/MOSW 数据串传送
指令汇编格式:MOVS/MOVSB/MOVSW [dstr,sstr]
操作:将DS段SI指出的字节(或字)数据传送到ES段DI指出的单元,
然后根据标志位DF的情况和操作数的类型(字节或字)修改SI,DI的地址指针。
具体描述如下:
(ES:DI)<-(DS:SI)
SI <- SI ± 1 或 2
DI <- DI ± 1或2
受影响的标志位:没有
说明:
1)MOVSB,MOVSW明确指出串的类型是字节串还是字串,因此不需要操作数
2)使用MOVS指令时,必须指定操作数以便确定处理的是字串还是字节串。
3)指令中的递增或者递减量在字节串时为1,在字串时为2,DF为0时为增量,为1时为减量
4)用此指令可完成存储器->存储器的数据传送。
5)此指令用重复前缀可以实现数据块的传送。

REP:重复前缀
使用方法及格式:REP 基本串操作指令
操作:基本串操作指令使用REP前缀时,根据CX值的情况重复执行后面的基本串操作指令,
每执行一次CX减1,直到CX=0为止,意思是“当CX!=0时重复”。
受影响的状态标志位:由串操作基本指令的执行情况决定。

2.LODS/LODSB/LODSW 取数据串
指令汇编格式:LODS/LODSB/LODSW [sstr]
操作:将DS段SI指出的字节(或字)数据加载到累加器AL(AX)中,然后修改SI的
地址指针。具体描述如下:
AL(或AX)<- (DS:SI)
SI<-SI±(1或2)
受影响的状态标志位:没有
说明:此条指令一般不加重复前缀,因为加入重复前缀之后累加器中新加载的内容不断取代原来
的结果,将只留下最后一个加载的元素。
3.STOS/STOSB/STOSW存数据串
指令汇编格式:STOS/STOSB/STOSW [dstr]
操作:将AL(目标串为字节串时)或AX(目标串为字串时)的内容存储到ES段DI指出的地址单元中,
然后修改DI的地址指针。具体描述如下:
(ES:DI)<-AL(或AX)
DI<-DI ±(1或2)
受影响状态标志位:没有。
说明:借助STOS指令使用重复前缀可以方便地用一个常数对一块存储区初始化。
4.CMPS/CMPSB/CMPSW 串比较
指令汇编格式:CMPS/CMPSB/CMPSW [dstr,sstr]
操作:将DS段SI指出的数据与ES段DI指出的数据相减比较,产生标志位的变化,然后修改SI,DI的地址指针。
具体描述如下:
(DS:SI)-(ES:DI)
SI<-SI±(1或2),DI <- DI ± (1或2)
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:此指令只改变标志,并不送回结果,因而不改变数的原始值。
条件重复前缀REPZ/REPE和REPNZ/REPNE
使用方法及格式:这两条条件重复前缀的使用方法和格式与REP相同
操作:使用这两条前缀的串操作指令,在循环时不仅检测CX是否为0,还检查ZF标志位是否是1,以CX和ZF的
情况共同决定是否重复执行后面的基本串操作指令。
REPZ/REPE为CX!=0且ZF=1时重复执行基本操作,CX=0或ZF=0时停止重复。
REPNZ/REPNE为CX!=0且ZF=0时重复执行基本操作,CX=0或ZF=1时停止重复。
受影响状态标志位:由基本操作指令的执行情况决定。

5.SCAS/SCASB/SCASW串搜索
指令汇编格式:SCAS/SCASB/SCASW [dstr]
操作:将累加器AL(或AX)的值与ES段DI指出的元素相减比较,然后修改DI的地址指针。
AL(或AX)-(ES:DI)
DI <- DI ±(1或2)
受影响的状态标志位:OF,SF,ZF,AF,PF,CF
说明:1)此指令隐含指定AX或AL的值作为一个操作数,将其与ES:DI指出的数据串元素相比较

第八章 子程序设计
使用子程序的好处
(1)简化了程序设计过程,减少了工作量,节省了时间
(2)源程序缩短,节省了机器汇编源程序的时间和存储目标代码的存储空间
(3)增加了源程序的可读性,便于调试维护
(4)有利于程序模块化,结构化和自顶向下的程序设计
(5)子程序一旦编制成功,在开发研制各种软件时都可利用,大大缩短了软件的开发周期。
子程序(过程)定义伪指令
PN PROC [NEAR]/[FAR]//说明过程开始 可选参数,表示所定义的过程是近过程还是远过程,默认为NEAR
近过程只允许段内调用,调用和返回时只改变IP的值;
远过程允许段间调用,即调用和返回时CS和IP的值都发生改变
过程
过程
RET
PN ENDP //说明过程结束
1.调用分类:
(1)段内调用与段间调用
(2)直接调用与间接调用
2.调用指令CALL
指令汇编格式:
CALL PROCNAME/REGNAME/MEM_ADDR
操作:
(1)段内调用:
SP<-SP-2,(SP + 1,SP) <-IP
IP<-OFFSET PROCNAME/REGNAME/[MEM_ADDR]
(2)段间调用:
SP<-SP-2,(SP+1,SP)<-CS
CS<-SEG PROCNAME 或双字内存单元的高字
SP<-SP-2,(SP+1,SP)<-IP
IP<-OFFSET PROCNAME 或双字内存单元的高字
3.返回指令RET
指令汇编格式:RET[VAL]
操作: (1)段内返回:
IP<-(SP + 1,SP),SP <- SP + 2
SP<-SP+VAL(如果选了VAL)
(2)段间返回:
IP<-(SP+1,SP),SP<-SP+2
CS<-(SP+1,SP)
SP<-SP+2
SP<-SP+VAL(如果选了AVL)
VAL是可选项。VAL是一个无符号偶数。
说明:子程序的最后一条指令必须是该指令,使程序回到调用子程序的地方继续执行。
8.4子程序设计方法
8.4.1现场的保护和恢复
方法:
(1)利用压栈和出栈指令,将寄存器内容或状态标志位内容保存在堆栈中,恢复时再从堆栈中取出。
(2)利用内存单元。用传送指令将寄存器的内容保存到指定的内存单元,恢复时再用传送指令取出
8.4.2子程序说明文件
(1)子程序名
(2)子程序功能
(3)入口条件
(4)出口条件
(5)受影响的寄存器
8.4.3 主程序与子程序之间的参数传递
常用的传送方法有四种:
(1)约定寄存器法
(2)约定存储单元法
(3)堆栈法
(4)约定参数地址指针法
8.5子程序嵌套
8.6子程序递归

debug 补充:
vm 的共享文件目录
/mnt/hgfs/

(1)设置反汇编的代码为intel格式

   gdb默认反汇编为att格式的指令。可以通过show disassembly-flavor查看。如果习惯intel格式的,用命令

   set disassembly-flavor intel设置。(1)设置反汇编的代码为intel格式

   gdb默认反汇编为att格式的指令。可以通过show disassembly-flavor查看。如果习惯intel格式的,用命令

   set disassembly-flavor intel设置。
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dearzcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值