汇编语言学习笔记-整数的加减乘除等指令
整数的加法和减法指令
能完成字节、字或双字长度操作数的加减运算
特别注意:有些指令并没有说明源操作数能为立即数,则在该条指令中,如果源操作数为立即数,则报错,如:mul,div等,因为,如果没有指明其操作位数,则不知道从哪一个寄存器找到另一个操作数。
- add 目的操作数,源操作数- sub 目的操作数,源操作数
另外还有inc和dec 指令,用来进行加一减一操作,neg 指令进行单操作数的补码
以上提到的指令和mov,xchg指令有所不同,他们都会对EFLAG寄存器的标志位进行更新。根据操作数的结果来设置SF、ZF、OF、AF、CF标志位的值。
- CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0;- PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;- AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少。最后四位向前有进位或者借位,AF=1,否则AF=0;- ZF:零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;- SF:符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;- TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行;- IF:中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断;- DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;注意此处DF的值是由程序员进行设定的 cld命令是将DF设置为0,std命令是将DF设置为1;- OF:溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;
add
add 目的操作数,源操作数
执行加法指令时,源操作数中的整数和目的操作数的整数部分相加,相加的结果将取代目的操作数中原来的值
sub
sub 目的操作数,源操作数
目的操作数中的整数减去源操作数中的整数,相减的差将取代目的操作数原来的值
inc、dec和neg
inc 目的操作数
自加1
dec 目的操作数
自减1
neg 目的操作数
取反
整数的乘法指令
有两条指令:
- imul:把操作数作为有符号数,乘积结果的符号由有符号数的乘法规则决定
- mul:把操作数作为无符号二进制数
如果是非负树进行乘法运算,通常是使用mul而不是imul,因为mul的速度更快
mul
mul 源操作数
源操作数可以是字节,字或者双字,也可以放在储存器或者寄存器,另一个乘数总在累加器中。
为什么要用双倍的长度去存值:
假如现在使用cl运算(假设都是最大值)mul cl则实际上的运算是:
al*cl=byte*byte=2的8次方*2的8次方=2的16次方=word
所以无论怎么变值,都不会超过word长度,但是可能会超过byte长度。因此需要一个与当前长度匹配的寄存器来存放可能超出当前长度的部分
除法同理
自我总结:
源操作数位数 | 源操作数单位 | 另一个乘数存放位置 | 答案位数 | 寄存器单位 | 答案存放位置 |
---|---|---|---|---|---|
8 | Byte | AL | 16 | Word | AL(底8位):AH(高8位) |
16 | Word | AX | 32 | Word | AX(底16位):DX(高16位) |
32 | Dword | EAX | 64 | DWord | EAX(底32位):EDX(高32位) |
imul
imul具有三种格式:
- imul 源操作数
这部分和mul大致相同,源操作数不能是立即数,同时注意符号位 - imul 寄存器,源操作数
操作数必须是字或者双字,而不能是字节。 - imul 寄存器,源操作数,立即数
其中,寄存器用来存放乘积,
整数的除法指令
和乘法指令有丝相似。
- idiv:用于有符号二进制补码整数
- div:用于无符号整数的除法
注意,但操作数乘法指令用乘数和被乘数相乘,并且得到一个两倍长的成绩。而除法指令用一个两倍长的数作为被除数,用一个单倍长度的数作为除数,最后得到单倍长度的商和单倍长度的余数。
idiv 源操作数
div 源操作数
被除数位置 | 被除数 | 除数 | 商 | 余数 |
---|---|---|---|---|
AH(H):AL(L) | Word | Byte | AL | AH |
DX(H):AX(L) | Dword | Word | AX | DX |
EDX(H):EAX(L) | 2Dword | Dword | EAX | EDX |
除法指令不会改变源操作数(除数)!!
对所有的出发操作数,必须满足:
- 被除数 = 商 * 除数 + 余数
- 余数的符号和被除数相同(位运算里面也有相关的除法,但是其余数的符号可能和被除数相反)
cbw,cwd,cdq和cwde
以上四个指令都是可以对数进行扩展操作(正用0,负用1),且都没有操作数,默认对对应的寄存器进行操作,如下
- c:change
- b:byte
- w:word
- d:dword
- q:双dword
原类型 | 目的类型 | 指令 | 源操作数 | 目的操作数 |
---|---|---|---|---|
字节 | 字 | cbw | AL | AX |
字 | 双字 | cwd | AX | DX:AX |
字 | 双字 | cwde | AX | EAX |
双字 | 四字 | cdq | EAX | EDX:EAX |
movzx和movsx
movzx 寄存器,源操作数
总是用位为0来扩展源操作数。
movsx 寄存器,源操作数
用复制符号位来扩展源操作数
汇编语言学习笔记-整数的加减乘除等指令相关推荐
- MIPS汇编语言学习笔记11:整数减法 (mult方法)
任务:整数相乘,并输出打印. 代码: .dataintA: .word 5intB: .word 2 .textli $v0, 1lw $a1, intAlw $a2, intBmult $a1, $ ...
- 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)
这是<Assembly Language step by step programming with linux>书中的最后一个程序,也是全书中的最复杂的一个程序. 首先看一下这个程 ...
- MIPS汇编语言学习笔记07:打印双精度浮点数
课程原视频: https://www.bilibili.com/video/BV19J411y7pA?p=7 程序功能: 设定两个双精度浮点型数据,将其相加后打印输出. 代码: .datamyDoub ...
- windows下32位汇编语言学习笔记
windows下32位汇编语言学习笔记 第一章 第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...
- win32汇编语言学习笔记(三)
汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...
- 菜鸟的汇编语言学习笔记
汇编语言学习笔记 1.1机器语言 计算机发展初期,人们都是用机器语言进行编程的,这也是人们能实现编程控制计算机的最低级别.那么机器语言是什么样子的呢?就是用0和1组成的一个串(形如011010101) ...
- Vue.js 学习笔记三,一些基础指令,v-bind,v-on
在笔记二的基础上继续写 v-bind指令,为属性绑定数据 <!--v-bind指令可以绑定属性--><div v-html="msg2" v-bind:title ...
- Vue.js 学习笔记 二,一些输出指令
Vue的一些输出指令 {{字段}},v-text指令,v-html指令 <html> <head><meta name="viewport" cont ...
- MIPS汇编语言学习笔记23:if 语句分支指令
C语言 #include<stdio.h> int main() {int i = 3;if (i < 5){printf("yes!\n");}else{pri ...
最新文章
- linux gcc安装
- word公式和文字不在一行上,错位了如何解决
- 图5-5与代码中变量的对应关系
- 伦斯勒理工学院计算机科学本科,【择校解读】伦斯勒理工学院(RPI)院校指南...
- 将下图的nfa确定化为dfa_「线性代数」根据特征值,将二次型化为标准形、规范形...
- 进击吧! Blazor 第一期
- Java 8将默认使用传输级别安全性(TLS)1.2
- linux chmod修改权限失败,【Linux】chmod修改文件权限
- linux .i文件,Linux的文件I/O
- Github趋势榜第一!英伟达发布StyleGAN2,生成图像逼真到吓人
- StanfordDB class自学笔记 (14) On-Line Analytical Processing
- 【九天教您南方cass 9.1】 11 方格网土方计算
- 计算机仿真软件在医疗应用,医学虚拟仿真应用介绍
- 160813_qt显示阿拉伯输入法9x7点阵
- 网络编程(含 UrlConnection 发送 HTTP 请求下载文件)
- 显著性检验 python p值_python相关性分析与p值检验
- FFmpeg安卓流媒体播放器开发实战视频课程 -基于NDK、C++和 FFmpeg Android
- UG二次开发-程序视图根组
- python伪装ip地址_python伪造ip
- 边打游戏边学编程,是一种怎样的体验?
热门文章
- 小白常犯-细节解析:nodejs使用https请求baidu.com 返回302错误
- java 配置微信js sdk_Java微信公众平台开发(十一)--微信JSSDK中Config配置
- OSPFv3之路由起不来小结
- JAVA string、int、 double 转换
- 手机蓝牙控制继电器实验
- 2003年某神秘组织的技术栈,曝光出来竟是这样,网友炸了
- java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c 多商户入驻商城 直播 电子商务之全渠道数据库高可用
- 「推荐」Linux远程连接工具之ssh客户端工具
- 增强版Switch语句的使用方法
- RETHINKING THE VALUE OF NETWORK PRUNING 笔记: