十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)
0. 存储指令
语法:
mov 寄存器,寄存器
mov 寄存器,[偏移地址]
mov [偏移地址],寄存器
mov ds:[偏移地址],寄存器
1. 加法指令
add 加法
语法:
add 目的操作数,源操作数
执行的操作:目的操作数 <- 目的操作数 + 源操作数
实例:
assume cs:daima
daima segmentmov ax,1000Hmov bx,2000Hadd bx,axmov ax,4c00Hint 21H
daima ends
end
inc 加1
语法:
inc 操作数
执行的操作:操作数 <- 操作数 + 1
实例:
assume cs:daima
daima segmentmov ax,1000Hinc axadd bx,axmov ax,4c00Hint 21H
daima ends
end
2. 减法指令
sub 加法
语法:
sub 目的操作数,源操作数
执行的操作:目的操作数 <- 目的操作数 - 源操作数
实例:
assume cs:daima
daima segmentmov ax,5000Hmov bx,3000Hsub ax,bxmov ax,4c00Hint 21H
daima ends
end
dec 加1
语法:
dec 操作数
执行的操作:操作数 <- 操作数 - 1
实例:
assume cs:daima
daima segmentmov ax,1001Hdec axmov ax,4c00Hint 21H
daima ends
end
加减法汇总实例
;段地址偏移地址2000-2005中依次放入数据FF、FE、FC、FB、FAassume cs:daima
daima segmentmov ax,2000Hmov ds,axmov bx,0000Hmov ah,0FFHmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahinc bxdec ahmov [bx],ahmov ax,4c00Hint 21H
daima ends
end
3. 循环指令
loop 循环指令(for)
语法:
loop 标号
执行步骤:
a 将cx寄存器中的值减1
b 判断cx寄存器中的值是否为0.不为0转至标号处执行程序,为0向下执行。
标号:在汇编程序中,为指令的位置标记。
模型:
mov cx,循环次数
标号:循环体
loop 标号
实例
assume cs:daima
daima segmentmov ax,0000Hmov cx,2HA:inc zxloop Amov ax,4c00Hint 21H
daima ends
end
;段地址偏移地址2000-2005中依次放入数据FF、FE、FC、FB、FAassume cs:daima
daima segmentmov ax,2000Hmov ds,axmov bx,0000Hmov ah,0FFHmov [bx],ahmov cx,4HA:inc bxdec ahmov [bx],ahloop Amov ax,4c00Hint 21H
daima ends
end
4. 乘法指令
MUL
作用:乘法运算
格式:MUL (寄存器 | 内存单元)
8位乘数时,被乘数在AL内,乘积将存储在AX内。
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov bl,16Hmov al,17Hmul bl ;ds:[00H]mov ax,4c00Hint 21H
code ends
end start
8位实例:
;8位乘法
assume cs:code,ds:data
data segmentdb 03H,04Hdw 0FFH
data endsstack segment
stack endscode segment
start:mov ax,datamov ds,axmov al,ds:[0]mov ah,ds:[1]mul ahmov ds:[2],axmov ax,4c00Hint 21H
code ends
end start
16位乘数时,被乘数在AX内,乘积在DX,AX内,遵循高存高,低存低原则。(DX存放高位,AX存放低位)
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov bx,0FFFFHmov aX,0FFFFHmul bxmov ax,4c00Hint 21H
code ends
end start
5. 除法指令
DIV
作用:除法运算。
格式:DIV (寄存器 | 内存单元)
8位除数时,被除数在AX内,商在AL内,余数在AH内。
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov ax,4DHmov bl,0AHdiv blmov ax,4c00Hint 21H
code ends
end start
16位除数时,被除数在DX和AX内,商在AX内,余数在DX内。(DX存放高位,AX存放低位)
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov dx,000FHmov ax,0001Hmov bx,03E8Hdiv bxmov ax,4c00Hint 21H
code ends
end start
16位实例:
;16位除法
assume cs:code,ds:data
data segmentdd 00015F99Hdw 0384H,0H,0Hdb 0FFH
data endsstack segment
stack endscode segment
start:mov ax,datamov ds,axmov dx,ds:[2]mov ax,ds:[0]mov bx.ds:[4]div bx;div word ptrbx ds:[4]mov ds:[6],axmov ds:[8],dxmov ax,4c00Hint 21H
code ends
end start
6. jmp无条件跳转指令(自己理解为go to语句,向前向后跳转均可)
作用:无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
段内短转移(移动范围:-128~127) JMP SHORT 标号(占两个字节)
段内近转移(移动范围:-32768~32767) JMP NEAR PTR 标号(占3个字节)
红箭头表示占字节几位,也就是取值范围大小。
实例:
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov ax,bxjmp short s0 ;取值范围小;jmp near ptr s0 ;取值范围大mov ax,bxmov ax,bxs0: mov bx,cxmov bx,cxmov bx,cxmov ax,4c00Hint 21H
code ends
end start
jmp指令段间转移
作用:无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
段间远转移 JMP FAR PTR 标号(占5个字节)
FAR PTR 指明了转移指令用标号的段地址和偏移地址修改CS和IP。
assume cs:code,ds:data
data segment
data endsstack segment
stack endsabc segment
s1:mov bx,cxmov bx,cxmov bx,cx
ends abccode segment
start:mov ax,bxjmp far ptr s1 ;abc段中的s1s0:mov cx,dxmov cx,dxmov cx,dxmov ax,4c00Hint 21H
code ends
end start
jmp指令转移地址
转移地址可以在寄存器中
JMP 寄存器(16位)(段内转移)
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov ax,bxmov ax,offset s0jmp axmov bx,cxs0:mov cx,dxmov ax,4c00Hint 21H
code ends
end start
转移地址可以在内存中(自己感觉像if语句的语法,通过判断跳转内存某内存位置)
JMP WORD PTR 内存单元地址(段内转移)
assume cs:code,ds:data
data segmentdw 0000H,0FFFFH
data endsstack segment
stack endscode segment
start:mov ax.datamov ds,axmov ax,offset s0mov ds:[0],axjmp word ptr ds:[0]mov bx,cxs0:mov cx,dxmov ax,4c00Hint 21H
code ends
end start
JMP DWORD PTR 内存单元地址(段间转移)(跳转到段地址2233,偏移量为0011的位置)
assume cs:code,ds:data
data segmentdw 0000H,0000H,0FFFFH
data endsstack segment
stack endsabc segmentmov ax,bxs0:mov ax,bxmov ax,bx
ends abccode segment
start:mov ax.datamov ds,axmov bx,abcmov ds:[0002H],bxmov bx,offset s0mov ds:[0],bxjmp dowrd ptr ds:[0]mov ax,4c00Hint 21H
code ends
end start
7. jcxz有条件跳转指令(if语句,判断cx寄存器是否为0)
作用:有条件转移指令。段内短转移,范围为:-128~127。
格式:JCXZ 标号
解释:如果CX寄存器的值为0,则转移到标号处执行。
实例1:
assume cs:code,ds:data
data segment
data endsstack segment
stack endscode segment
start:mov ax,bxmov ax,bxmov cx,0Hjcxz s0mov ax,bxmov ax,bxs0:mov bx,cxmov ax,4c00Hint 21H
code ends
end start
实例2:
;判断cx寄存器是否为0,不为0返回s0,否则执行s1,实现了loop循环功能
assume cs:code,ds:data,ss:stack
data segmentdw 2H.2H,2H,0H,2H,2H
data endsstack segment
stack endscode segment
start:mov ax,datamov ds,axmov bx,0s0: mov cx,ds:[bx]jcxz s1add bx,2Hjmp s0
s1:mov dx,bxmov ax,4c00Hint 21H
code ends
end start
8. RET与RETF指令(跳转)
RET指令
RET指令取栈中的数据,修改IP寄存器的内容,从而实现近转移。
;取出栈60-2地址位数据1111(2个字节),将CS的IP指针赋值为1111,栈同时做了pop,SP指针恢复到60H.
assume cs:code,ds:data,ss:stack
data segment
data endsstack segmentdw 256 dup [0H]
stack endscode segment
start:mov ax,stackmov ss,axmov sp,60Hmov ax,1111Hpush axret mov ax,4c00Hint 21H
code ends
end start
RETF指令
RETF指令取栈中的数据,修改CS和IP寄存器的内容,从而实现远转移。
;取出1122放入cs,3344放入ip,恢复至sp为60
assume cs:code,ds:data,ss:stack
data segment
data endsstack segmentdw 256 dup [0H]
stack endscode segment
start:mov ax,stackmov ss,axmov sp,60Hmov ax,1122Hmov bx,3344Hpush axpush bxretfmov ax,4c00Hint 21H
code ends
end start
9. CALL指令(跳转,形成子程序)
语法:CALL 标号(与ret配合使用形成子程序)
作用:将IP寄存器的值进栈,然后转到标号处执行指令。
;一个简单的子程序设计完成了
assume cs:code,ds:data,ss:stack
data segment
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,stackmov ss,axmov sp,60Hmov ax,bxcall s0mov ax,bx ;将ax,bx地址放入ss的005e中,跳转到s0mov ax,4c00Hint 21Hs0:mov bx,cxmov bx,cxret ;恢复,从而形成子程序
code ends
end start
CALL指令与段间转移
语法:CALL FAR PTR 标号(与retf配合使用形成子程序)
作用:将CS寄存器、IP寄存器进栈,然后转到标号处执行指令。
assume cs:code,ds:data,ss:stack
data segment
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,stcakmov ss,axmov sp,60Hmov ax,bxcall far ptr s0 ;先将cs值放入ss,再将ip值放入ss,ss中存放2个字mov ax,bxmov ax,bxs0:mov bx,cxmov bx,cxretfmov ax,4c00Hint 21H
code ends
end start
CALL指令与寄存器
作用:将IP寄存器的值进栈,然后转到寄存器值的位置执行指令。
assume cs:code,ds:data,ss:stack
data segment
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,stcakmov ss,axmov sp,60Hmov ax,bxmov cx,offset s0 ;将标号存放入寄存器,在call寄存器达到跳转call cxmov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H
code ends
end start
CALL指令与内存
语法:CALL WORD PTR 内存单元地址(ret配合使用)
作用:将IP寄存器的值进栈,然后转到内存单元所存储值的位置执行指令。
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,datamov ds,axmov ax,stcakmov ss,axmov sp,60Hmov word ptr ds:[0H],offset s0 ;将s0放入数据段内存偏移地址中mov ax,bxcall word ptr ds:[0H] ;跳转ds的偏移地址存储的代码mov ax,bxs0:mov bx,cxmov bx,cxretmov ax,4c00Hint 21H
code ends
end start
语法:CALL DWORD PTR 内存单元地址(retf配合使用)
作用:将CS寄存器、IP寄存器进栈,然后转到内存单元所存储值的位置执行指令。
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,datamov ds,axmov ax,stcakmov ss,axmov sp,60Hmov word ptr ds:[0H],offset s0 ;将s0放入数据段内存偏移地址中mov word ptr ds:[2H],offset code ;放入代码段cs值放入ds内存mov ax,bxcall dword ptr ds:[0H] ;跳转ds的偏移地址存储的代码mov ax,bxs0:mov bx,cxmov bx,cxretfmov ax,4c00Hint 21H
code ends
end start
10. ADC指令(区别ADD指令)
ADC指令:带进位加法指令。
作用:在计算加法的时候,一同带上CF标志位上的进位值进行计算。
;1AFFFF + 2CFFFC = ?
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,1AHmov bx,0FFFFHmov cx,2CHmov dx,0FFFCHadd bx,dxadc ax,cxmov ax,4c00Hint 21H
code ends
end start
11. SBB指令
SBB指令:带借位减法指令。
作用:在计算减法的时候,一同带上CF标志位上的借位值进行计算。
ADC指令:带进位加法指令。
作用:在计算加法的时候,一同带上CF标志位上的进位值进行计算。
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,0037Hmov bx,0000H ;00370000Hmov cx,0030Hmov dx,0001H ;00300001Hsub,bx,dxsbb,ax,cx ;注意先从低位数做减法,后做高位数减法.mov ax,4c00Hint 21H
code ends
end start
12. CMP指令(比较指令,自己理解为if语句里做等号不等号判断)
CMP指令:比较指令。
作用:计算减法功能,但并不保存结果,仅仅根据计算结果影响标志寄存器的位。
CMP指令比较对照(CMP A,B):
ZF=1 A=B(等于)
ZF=0 A!=B(不等于)
CF=1 A<B(小于)
CF=0 A>=B(大于或等于)
CF=0并且ZF=0 A>B(大于)
CF=1或者ZF=1 A<=B(小于或等于)
13. 条件转移指令(if条件转移)
条件转移指令:根据条件是否满足,来决定是否修改IP。
条件转移指令对照(CMP A,B):
ZF=1 A=B(等于) JE
ZF=0 A!=B(不等于) JNE
CF=1 A<B(小于) JB
CF=0 A>=B(大于或等于) JNB
CF=0并且ZF=0 A>B(大于) JA
CF=1或者ZF=1 A<=B(小于或等于) JNA
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,0011Hmov bx,0011Hcmp ax,bxje s ;举例ZF=1 A=B JEmov ax,bxmov ax,bxs:mov bx,cxmov bx,cxmov ax,4c00Hint 21H
code ends
end start
14. movsb、movsw(串传送指令)
movsb指令(1个字节)
功能:将ds:si指向的内存单元中的字节传送入es:di指向的内存单元,然后根据DF标志位的值,将si、di递增1或递减1。
movsw指令(2个字节)
功能:将ds:si指向的内存单元中的字传送入es:di指向的内存单元,然后根据DF标志位的值,将si、di递增2或递减2。
15. rep指令 (重复前缀指令,一种循环的方式)
REP 重复前缀指令
作用:根据CX的值,重复执行后面的串传送指令。
;从前向后依次复制粘贴,递增
assume cs:code,ds:data,ss:stack
data segmentdb 'china os'db 8 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,datamov ds,axmov si,0Hmov es,axmov di,8Hcld ;设置DF值为0mov cx,8H ;循环8次rep movsb ;重复cx的次数; movsb ;依次将ds寄存器数据偏移赋值到8-16,标志位递增,0赋值8
; movsb ;1赋值9
; movsb ;2赋值A
; movsb
; movsb
; movsb
; movsb
; movsbmov ax,4c00Hint 21H
code ends
end start
16. INT 指令(强制触发中断,结束中断 int 21H)
作用:触发中断过程。
语法:INT 中断类型码
assume cs:code,ds:data,ss:stack
data segmentdw 256 dup (0H)
data endsstack segmentdw 256 dup (0H)
stack endscode segment
start:mov ax,1000Hint 0 ;除法溢出中断mov ax,4c00Hint 21H
code ends
end start
17. 与比较(and)
实例:
test al,al
18. 取ebx补码
实例:
neg ebx
十四、汇编指令(存储、加法、减法、乘法、除法、跳转、子程序、if判断、中断)相关推荐
- java BigDecimal加法/减法/乘法/除法 保留两位小数
1.BigDecimal类概述及其构造方法 由于在运算的时候,float类型和double类型很容易丢失进度,所以,为了能够精确的表示.计算浮点数,java提供了BigDecimal类 BigDe ...
- pytorch基本数学运算:加法 减法 乘法 除法 指数 对数 绝对值
加法 import torch import numpy as npprint('# 加法') a = torch.Tensor(np.arange(6).reshape(2, 3)) b = tor ...
- c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...
- java实现一元多项式减法_一元多项式 加法 减法 乘法
1 #include 2 #include 3 //系数 coefficient,coef4 //指数 exponent, expon 5 typedef struct polyNode*polyno ...
- 矩阵加法减法乘法计算
矩阵 最近在做重写帧同步矩阵相关运算的时候突然发现自己矩阵乘法运算怎么做了,这里参考别人文档写一篇让自己巩固下矩阵算法.(文章中括号就不画了,用 [ ] 代替了) 矩阵加法 计算公式如下 /// [ ...
- Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider
Android提供以下四种存储方式: SharePreference SQLiteFile ContentProvider Android系统中数据基本都是私有的,一般存放在"data/da ...
- 用74ls90组成二十四进制计数器_减法计数器的组成以及原理
异步二进制减法计数器如图1-1所示 减法计数器的结构原理 1-1减法计数器的结构原理 该计数器是一个3位二进制异步减法计数器,它与前面介绍过的3位二进制异步加法计 数器一样,是由3个JK触发器组成,其 ...
- 逆向课程第四讲逆向中的优化方式,除法原理,以及除法优化上
一丶为什么要熟悉除法的优化,以及除法原理 是这样的,在计算机中,除法运算对应的汇编指令分为 DIV(无符号除法指令) 以及 IDIV(有符号除法指令). 但是,除法指令的执行周期较长效率很低.所以编译 ...
- 三角矩阵上三角列优先压缩存储---加法、减法、乘法、转置、秩、行列式值、伴随矩阵、逆
三角矩阵上三角列优先压缩存储: 我们以图4.9中的矩阵A矩阵为例,针对A上三角部分,采用以列为主序存储至一个一维数组B内,按照三角矩阵上三角元素构成可知,该部分有n(n+1)/2个元素,因为下三角中的 ...
最新文章
- 装上螺旋桨,加州理工让只能行走的双足机器人「上了天」,还玩起了障碍滑板、走绳索...
- 当 Redis 发生高延迟时,到底发生了什么
- 译-在Python正则模式中search()和match()的区别是什么?
- tar oracle home 权限不够,linux系统安装jdk
- 两个“敢”,是销售员必须懂的心法
- 区块链相关名词解释(一)
- 极简主义︱利用apple机器学习平台Turicreate实现图像相似性检索(二)
- Python 链表实现
- 【雷达通信】基于matlab雷达数字信号处理【含Matlab源码 281期】
- JSP中文乱码问题终极解决方案(下)
- 支持javascript的ppt软件_14款基于Javascript的数据可视化工具
- 浙江大学计算机博士很难复试专业课,2017年浙江大学计算机考研_跨考_复试经验谈...
- xpath中ends-with无法定位问题的解决办法
- 列表解析(值得学习)
- 一个只完成了一部分的小游戏。。。
- 电脑开机直接进BIOS界面怎么办
- 帝国cms【官方教程系列教程一】 首页模板制作
- SQL基本语句学习(上)
- 约瑟夫环问题(递推公式)
- 7-3 求最大值 (10 分)
热门文章
- netty在项目中实际使用_聚合氯化铝在实际使用中的用法和用量
- 1.8编程基础之多维数组 03 计算矩阵边缘元素之和 python
- 第33课 打擂台 《小学生C++趣味编程》
- 好用的重装系统前使用的windows系统软件名称导出备份工具
- es6 filter函数的用法_Python 函数式编程指北,不只是面向对象哦!超级详细!
- PHP笔记-打印99乘法表例子
- Linux笔记-配置本地光盘未yum源
- Arduino笔记-Arduino UNO与WeMos D1串口通信(数据交互)
- DM工作笔记-dimp及dexp的使用及解决该工具不能解析此文件,请使用更高版本的工具
- Qt|OpenGL-天空盒子的创建