汇编学习(四)——算术运算程序

(一)跳转指令

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

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<--余数

时间: 2024-08-03 15:22:40

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

AT&amp;T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&

我的汇编学习之路(2):主要术语和概念

对于不折不扣的汇编新手来说,第一部分中出现的很多概念可能不是很明白,于是我决定写更多有价值的文章.所以,让我们开始<我的汇编学习之路>的第二部分的学习. 术语和概念 当我写了第一篇之后,我从不同的读者那获得很多反馈,第一篇中有些部分不明白,这就是本文以及接下来几篇从一些术语的描述开始的原因. 寄存器(Register):寄存器是处理器内小容量的存储结构,处理器的主要功能是数据处理,处理器可以从内存中获得数据,但这是一种低速的操作,这就是为什么处理器为什么要有自己数据存储结构,称为"寄

Arm汇编学习总结

 Arm汇编学习总结: 1. LDR/STR架构 1).ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理. 2).ldr(load register)指令将内存内容加载入通用寄存器. 3).str(store register)指令将寄存器内容存入内存空间中. 4).ldr/str组合用来实现 ARM CPU和内存数据交换. 3级流水线如图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载

基于8086CPU微处理器的汇编学习之MOV指令

汇编指令:MOV的作用是往某个寄存器中存入数值. 格式:mov  寄存器名,数值                数值-->寄存器 mov  寄存器A,存器寄B          B-->A PS:必须前后位数匹配,如: mov   ah,bx     ;error   ah is 8 bit,bx is 16 bit mov   ah, bh    ;right    ah and bh all is 8  bit mov   cx,dx     ;right     cx and dx al

nodejs学习四 Node.js NPM

什么是NPM? 不知道大家注意没有,windows平台下的Node.js安装包大小才区区4M多,真可以用短小精悍来形容它,作为一种编程语言,像java一个SDK 就几十M,为什么node.js的运行环境这么小呢?这其中的微妙之处在于,它拥有一个庞大的第三方软件库. 在Node本身提供的包(原生)中没有我们要实现的功能模块的时候,我们可以去寻找下是否已经有人实现了这种功能.毕竟重复造轮子这种事情,很多人都不想干. 去哪里寻找我们想要的包呢?如果你还不知道报的名字,你可以去https://www.n

基于8086CPU微处理器的汇编学习之ADD指令

ADD指令: 把两个数值相加,将结果放到第一个寄存器里面. 格式: ADD  寄存器名,数值 ADD  寄存器名,寄存器名 add ax,11 add bx,22 PS:清空数据: mov ax,0000 两者数值的存储容量位数要匹配 ----------------------------------------------------------------------------------------------- 用汇编语言编写一个小程序:1122H + 9000H +   AC02H

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

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议把昨天代码熟悉一遍(课程是紧跟着来的,请不要拉下任何一天,因为今天的知识, 可能就和昨天的知识挂钩,昨天的知识,和前天的挂钩.....,当然你如你懂汇编,不是新手,那么则可以直接往下看) 一丶远程线程注入,和汇编远程注入的区别 昨天的代码,大家可能看了(没看也没有关系,就是远程线程注入的代码,开发角

ZigBee学习四 无线+UART通信

ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; //unsigned char uartbuf[128];/********************************************************************** L

Spark学习四:网站日志分析案例

Spark学习四:网站日志分析案例 标签(空格分隔): Spark Spark学习四网站日志分析案例 一创建maven工程 二创建模板 三日志分析案例 一,创建maven工程 1,执行maven命令创建工程 mvn archetype:generate -DarchetypeGroupId=org.scala-tools.archetypes -DarchetypeArtifactId=scala-archetype-simple -DremoteRepositories=http://scal

Beaglebone Back学习四(GPIO实验)

GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有"复用"的特性,大约每个引脚有8种工作模式(Beagle System Reference Manual),默认情况下,设为Mode7.由于P8扩展部分的引脚功能相对简单,复用不多,故项目功能复杂时,最好选择P8上的GPIO口. 对GPIO口的操作,主要有三个步骤 1 选择GPIO口根据以下两表,确定使用那个GPIO口,该表也可以在BBB_SRM文件中找到. (1)拉电流