(一)跳转指令

一、无条件跳转指令(不管标志寄存器,执行到这句直接跳转)

1、段内直接跳转指令

(1)指令格式:

JMP SHORT short_label;         IP<--IP+DB,即代码直接跳转到此地址为
JMP near_label; IP<--IP+D16 基准的相应的地址中

(2)其实就是GOTO语句,不同的就是他跳转只能以跳转地址与目前地址的偏差量来进行跳转。

 

2、段间直接跳转语句

(1)指令格式:

JMP far_label;  IP<-标号的偏移地址,CS<--标号的段地址

       若指定的目标标号在另一个段中,就成为了段间跳转指令

(2)一个demo

CODE SEGMENT
ASSUME CS:CODE
START: 1~3条JMP指令没有指定标号的类型(FAR,NEAR),汇编程序默认为段内的标号,并根据标号的距离大小自动处理成SHORT或者NEAR类型
JMP START; 被翻译成段内短跳转
   JMP EXIT;                  被翻译成段内直接跳转,但因为跳转的距离较短,所以又自动改为段内短跳转,所以加了个NOP
JMP EXIT1; 被翻译成段内直接跳转
   JMP SHORT EXIT;            被翻译成段内短跳转
JMP NEAR PTR EXIT; 被翻译成段内直接跳转,但因为跳转的距离较短,所以又自动改为段内短跳转,所以加了个NOP
JMP FAR PTR EXIT; 被翻译成段间直接跳转,单因为是段内的跳转且距离短,所以又自动改为段内短跳转,所以加了3个NOP
JMP FAR PTR EXIT2; 被翻译成段间直接跳转
EXIT:
MOV AH,4CH
INT 21H
ORG 200H ;其中ORG 200H是一个伪指令,指定段内偏移地址的伪指令,即接下来的指令从偏移地址200H开始存放
EXIT1:
MOV AH,4CH
INT 21H
CODE ENDS CODE1 SEGMENT
ASSUME CS:CODE1
EXIT2:
MOV AH,4CH
INT 21H
CODE1 ENDS
END START

3、段内间接跳转指令:

(1)指令格式:

JMP reg16          ;IP<--reg16
JMP mem16 ;IP<--mem16

     此指令的操作数必须是一个16位的通用寄存器或者16位的存储单元,功能是将此16位操作数赋给IP而实现跳转。

(2)一个demo:

设BX=1234H,DS=1000H,(11234H)= 5678H

若执行JMP BX,则IP=1234H
若执行JMP [BX],则IP=5678H

 

4、段间间接跳转指令

(1)指令格式:

JMP mem32;IP<--[mem32],CS<--[mem32+2]

(2)一个demo:

例如,设BX=1234H,DS=1000H,(11234H)=5678H,(11236H)=9ABCH,

若执行JMP [BX],则IP=5678H,CS=9ABCH,即程序跳到段地址为9ABCH,偏移地址为5678H的地址处继续执行。

 

二、条件跳转指令

1、指令的一般格式:

Jccc short_label;   若条件成立,则IP<--IP+D8,否则顺序执行

2、指令格式中的“ccc”是1~3个字母,指明判断的条件,目的地址是段内的短标号,但是范围只有D8,所以超出了合法范围,都会报错

3、所有指令汇总

 

三、循环控制指令

1、为了方便循环程序的设计,8086设计了一组共用4条用CX作为循环计数的循环控制指令,也正是由于这个原因,我们把CX成为计数寄存器。循环控制指令一般都要先对循环计数CX自动减1,然后在判断CX是否为0

2、CX不为0循环指令

(1)指令格式:

LOOP short_label;      CX<--CX-1,若CX不等于0,则跳转,否则顺序执行

(2)图示:

3、CX不为0且相等循环指令

(1)指令格式:

LOOPE short_label;     CX<--CX-1,若CX不等于0,且ZF=1,则跳转,否则顺序执行
LOOPZ short_label;

    所以只要用ZF=1,则就会提前结束循环

(2)图示:

4、CX不为0且不等循环指令

(1)指令格式:

LOOPNE short_label;  CX<--CX-1,若CX不等于0且ZF=0,则跳转,否则顺序执行
LOOPNZ short_label

 

5、CX为0跳转指令

(1)指令格式:

JCXZ short_label;若CX=0,则跳转,否则顺序执行

     CX=0时跳转,一般在循环体中需要跳出循环时使用

 

(二)算术运算指令

一、二进制运算指令

1、不带CF的加/减指令

(1)指令格式:

ADD dst,src;         dst<--dst+src
SUB dst,src; dst<--dst-src

    段寄存器不能使用,对6个条件标志位均有影响

 

2、带CF的加/减指令

(1)指令格式:

ADC dst,src;            dst<--dst+src+CF
SBB dst,src; dst<--dst-src-CF

(2)注意点

    一条带CF的加/减指令实际上涉及两个CF,参加加/减计算的是前一个字节计算后影响的CF,本次计算后影响的CF留下给下一字节计算。

 

3、比较指令

(1)指令格式:

CMP dst,src;       dst<—src

          CMP指令仅执行减法计算,不回送结果,所以目的操作数不变,但根据减计算的结果影响6个条件标志位,可用的操作数组合也与SUB等指令相同。(2

(2)ZF标志位变化意义:

ZF = 1,则两个数字相等,ZF = 0,则不相等。

(3)CF标志位意义:无符号数判断大小:

CF = 0,则被减数大于或等于减数,若CF 0 1,则相反。

(4)OF,SF标志位意义:有符号数判断大小:

A、

OF = 0, SF = 0,则被减数大于等于减数。
SF = 1,则被减数小于减数
OF = 1, SF = 0,则被减数大于减数
SF = 0,则被减数小于减数

B、OF和SF相同,被减数大于等于减数,OF和SF不同,被减数小于等于减数

 

4、加1/减1指令

(1)指令格式:

INC dst ;      dst<--dst+1
DEC dst; dst<-dst-1

能够使用的操作数是reg和mem,8位或者16位都可以

(2)功能:主要用于循环程序中对地址指令修改和对循环次数进行计数。

 

5、求补指令

(1)指令格式:

NEG dst;  dst<--0-dst

    能够使用的操作数也是reg和mem,8或者16位均可以。

(2)作用:

A、求带符号负数的绝对值

B、对带符号正数操作,得到绝对值相等的负数

 

6、乘法指令

(1)指令格式:

MUL src;     AX<-AL*8位src或  DX,AX<--AX*16位src   ;无符号数乘法指令,能做8位*8位,16位*16位的乘法运算,但乘法指令只能指定一个源操作数作为乘数,可以是
                                                  ;8位或者16位的reg或者mem。若操作数是16位,则乘积在DX(高16位)和AX(低16位中)
IMUL src; AX<-AL*8位src或 DX,AX<--AX*16位src ; 有符号数乘法指令

(2)相关注意点

      乘法指令对OF和CF标志位有影响,其他标志位不确定

A、无符号数,若高8/16位等于0则OF=CF=0,否则OF=CF=1

B、有符号数,若高8/16位的积的高16位DX是低16位AX的符号扩张,则OF=CF=0,OF=CF=1。

 

7、除法指令

(1)指令格式:

DIV src;   AX/8位src,AL<--商,AH<--余数
; DX(高)、AX(低)/16位src,AX<--商,DX<--余数
IDIV src; AX/8位src,AL<--商,AH<--余数
; DX(高)、AX(低)/16位src,AX<--商,DX<--余数

(2)相关注意点:

出发指令对标志位的影响是不确定的

 

8、符号扩展指令

(1)指令格式:

CBW;若AL最高位为1,则AH<--0FFH,否则AH<--0
CWD;若AX最高位为1,则DX<--0FFFFH,否则DX<--0

(2)使用地方:

    一条除法指令只能做16位除以8位,或32位除以16位的运算,若要进行8位除以8位,或16位除以16位的运算,则必须先把被除数从8位扩展到16位,或16位扩展到32位。一般是配合带符号除法

 

9、二进制运算指令的使用:

(1)一般只能带符号之间进行运算,不带符号之间进行运算

(2)但是要是1个带符号和一个无符号数进行乘法或者除法运算也是可以实现的:

A、求带符号数的绝对值

B、用无符号数乘或除指令进行此绝对值与无符号数的乘或除运算

C、将无符号数转换成带符号数

 

二、BCD码调整

1、压缩型BCD码加法调整指令:

(1)指令格式:

DAA;若AL的低4位>9或AF = 1,则AL<—AL + 06H,AF<--1
   ;若AL的高4位>9或CF = 1,则AL<—AL + 06H,CF<--1

(2)使用注意点:

DAA指令必须跟在一条以AL为目的操作数的ADC或着ADD指令之后,且相加的数必须是合法的压缩型BCD码

 

2、非压缩性BCD码加法调整指令

(1)指令格式:

AAA;若AL的低4位>9或AF=1,则AL<--AL+06H,CF<--AF<--1,AH<—AH - 1,AL高4位清0

(2)使用注意点:

AAA指令必须跟在一条以AL为目的操作数的ADC或着ADD指令之后,且相加的数必须是合法的压缩型BCD码

3、压缩型BCD码减法调整指令

(1)指令格式:

DAS;若AL的低4位>9或AF = 1,则AL<—AL - 06H,AF<--1
   ;若AL的高4位>9或CF = 1,则AL<—AL - 06H,CF<--1

(2)使用注意点:

DAS指令必须跟在一条以AL为目的操作数的SUB或着SBB指令之后,且相减的数必须是合法的压缩型BCD码

 

4、非压缩型BCD码减法调整指令

(1)指令格式:

AAS;若AL的低4位 > 9或AF = 1,则AL<—AL - 06H,CF<--AF<--1,AH<—AH - 1,AL高4位清0

(2)使用注意点:

DAS指令必须跟在一条以AL为目的操作数的SUB或着SBB指令之后,且相减的数必须是合法的压缩型BCD码

 

5、非压缩型BCD码乘法调整指令

(1)指令格式:

AAM;   AL<—AH * 0AH + AL,AH = 0

(2)使用注意点:

AAM指令必须跟在一条8位乘8位指令之后,且相乘的数必须是合法的压缩型BCD码

 

6、非压缩型BCD吗除法调整指令

(1)指令格式:

AAD;   AL<—AH / 0AH,AH<--商,AL<—余数

(2)使用注意点:

AAD指令必须放在一条16位除以8位指令之前,且相除的数必须是合法的压缩型BCD码

 

 

(三)多字节加/减运算程序

一、多字节加法程序流程图

 

二、程序如下:多字节加法

DATA SEGMENT                        ;数据段
DATA1 DB 4 DUP(?)
DATA2 DB 4 DUP(?)
DATA3 DB 5 DUP(?)
DATA ENDS CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX MOV SI,OFFSET DATA1 ;取地址
MOV DI,OFFSET DATA2
MOV BX,OFFSET DATA3
MOV CX,DATA2-DATA1
CLC NEXT: ;循环做加法
MOV AL,[SI]
ADC AL,[DI]
NOP
MOV [BX],AL INC SI
INC DI
INC BX LOOP NEXT MOV AL,0 ;处理最后的进位
ADC AL,0
MOV [BX],AL
MOV AH,4CH
INT 21H CODE ENDS
END START

三、基本调试方法:

1、显示和修改内存中的数据

(1)使用U命令可以看到反汇编得到的程序

从中可以得到数据段的地址是076A

(2)使用D命令可以看数据

(3)使用E命令进行修改

2、断点运行程序

(1)使用G命令可以使程序执行一段规定的长度。

3、修改程序指令

使用A命令,再键入要写入的命令即可。

 

(四)多字节除法程序

一、除法指令的除法程序

1、程序流程图如下:

2、程序如下:

DATA SEGMENT
DATA1 DB 4 DUP(?) ;被除数
DATA2 DB 1 DUP(?) ;除数
DATA3 DB 5 DUP(?) ;商
DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;初始化
MOV DS,AX LEA SI,DATA1 ;取地址
LEA DI,DATA3
MOV CX,DATA2-DATA1 ;确定循环次数
MOV AH,0 NEXT:
MOV AL,[SI] ;取被除数的一字节 NOP
NOP
DIV DATA2
MOV [DI],AL ;存储
INC SI
INC DI
LOOP NEXT MOV DATA3+4,AH ;对余数进行的处理
MOV AH,4CH
INT 21H
CODE ENDS
END START

 

二、被除数左移法的除法程序

1、程序流图

2、程序如下:

DATA SEGMENT
DATA1 DB 4 DUP(?)
DATA2 DB ?
DATA3 DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV CH,8*LENGTH DATA1
NEXT1:
LEA SI,DATA2-1
MOV CL,DATA2-DATA1
CLC
NEXT2:
MOV AH,[si]
adc ah,[si]
mov [si],ah
dec si
dec cl
jnz next2
adc al,al
JC NEXT4
cmp al,data2
jc next3
NEXT4:
sub al,data2
inc data2-1
next3:
dec ch
jnz next1
mov data3,al
mov ah,4ch
int 21h
code ends
end start

汇编学习(四)——算术运算程序的更多相关文章

  1. arm汇编学习(四)

    一.android jni实现1.静态实现jni:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法.2.动态实现jni:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在J ...

  2. MIPS汇编学习

    MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等一些嵌入式设备中. mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通用寄存器 ...

  3. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

  5. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

  6. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

  7. SVG 学习<四> 基础API

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. SCARA——OpenGL入门学习四(颜色)

    OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...

  10. android ARM 汇编学习 —— hello world

    android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...

随机推荐

  1. VMware Workstation 下进行 桥连接

    大家都知道进行桥连接的时候,需要我们的宿主机与虚拟机同处于一个网络段, 使得mask与默认网关相同即可进行连接 ; 本地的IP .掩码 . 网关: 虚拟机的Ip 掩码,网关: // 当然这里的DNS ...

  2. Unity3d NavMesh获得地面高度

    UnityPro内置的NavMesh有几个API很有用 NavMesh.SamplePosition 根据给的点进行采样,可传入最大距离,返回true说明采样到了点,否则采样失败(可以用来获得地形高度 ...

  3. Unity3d《Shader篇》地球旋转上空悬浮云层

    记得把纹理设置成Repeat Shader "Custom/Earth" { Properties { _MainTex ("Base (RGB)", 2D) ...

  4. 自动编译和提交脚本(结合svn和visual studio)

    @echo 更新代码开始----------------- TortoiseProc.exe /command:update /path:"D:\work\mmsanguo_publish_ ...

  5. ios 在程序中使用iCloud

    注意,这里说的使用icould不是用icloud进行系统备份,那个功能不需要我们写代码,备份到icloud的东西我们也不能操作.我们指的是以下这3种icloud使用方法: 这里有3中使用方法, Key ...

  6. redis+crontab+php异步处理任务

    2016年1月8日 16:08:43 星期五 情景: 用户登录日志, 发邮件, 发短信等等实时性要求不怎么高的业务通常会异步执行 之前接触过几种redis+crontab配套的实现方法, 比如: cr ...

  7. 一个不错的定位API网站

    2015年5月2日 15:36:31 星期六 http://www.haoservice.com/

  8. 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列

    引言:题目具体描述记不大清了,大概是:Linux平台,利用线程调度的随机性和sleep的不准确性,生成一个各位均不相同的字符数组的伪随机序列.不得使用任何库函数.(这句记得清楚,当时在想线程库算不算, ...

  9. FIX_前缀后缀_未提交

    问题 B: FIX 时间限制: 1 Sec  内存限制: 64 MB提交: 38  解决: 11[提交][状态][讨论版] 题目描述 如果单词 X 由单词 Y 的前若干个字母构成,我们称 X 是 Y ...

  10. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...