汇编语言:x86汇编指令大全及其注意事项 - 网站

汇编语言:x86汇编指令大全及其注意事项

分类:汇编语言 · 发布时间:2022-07-12 22:22 · 阅读:3256

用最精炼的语言,记录汇编语言中所有常用或不常用或极其重要的汇编指令及其注意事项,以方便自己和读者进行查阅,如有错误和不足请在评论区指出

Part 1:instruction

积少成多,持续更新。(这将会是一个极其漫长的过程)
表格中各条指令的顺序根据笔者所认为的重要或常用程度进行排序,仅供参考。

Part 2

本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以此类推。

2.1 (逻辑)运算、移位等常用指令

这一部分记录汇编语言程序设计当中使用频率最高的一部分指令。

2.1 (逻辑)运算、移位等常用指令

这一部分记录汇编语言程序设计当中使用频率最高的一部分指令。

指令作用注意事项示例
mov dest, src传送指令1.dest和src不能同时为存储器操作数
2.CS不能作为dest
3.段寄存器之间不能互相传送
4.立即数不能送入段寄存器
mov ax,word ptr[bx+si+2]
add dest,src加法指令dest,src不能同时为存储器操作数或段寄存器
add ax,cx
adc dest,src带进位加法指令dest=dest+src+CF,常用于多字节加法
inc dest加一指令1.此操作不影响CF的状态inc byte ptr[si]
sub dest,src减法指令1.dest,src的要求与add相同
2.触发OF:异号相减且结果的符号为与被减数不同
sub ax,cx
sbb dest,src带进位减法常用于多字节减法
dec dest减一指令不影响CF的状态,但其他几个标志位都会受到影响dec ax
mul dest无符号乘法指1.dest为字节数据,则与AL相乘,结果放入AX
2.dest为字数据,与AX相乘结果低16位放入AX,高16位放入DX
3.dest不能是立即数
mul ax
imul dest有符号乘法细节与mul完全相同,对最高位的解释不同imul ax
div dest无符号除法1.dest为字节数据,用AX除以dest,商放在AL,余数放在AH
2.dest为字数据,用低16位为AX,高16位为DX的双字数据除以dest,商放在AX,余数放在DX
idiv dest带符号除法与无符号完全相同。除法溢出时结果无效idiv ax
cbw扩展AL为AX字数据1.仅用于扩展带符号数,无符号直接清零即可
2.不带操作数
cbw
cwd扩展AX字为DX,AX双字数据要求与cbw相同cwd
seg取标号或变量的段地址mov di,seg label
lea取偏移地址1.与offset作用类似
2.load efficient address的简写
lea ax,label
offset取偏移地址1.作用与lea相同
2.速度比lea快
mov ax,offset label
org设定程序段起始地址(偏移)1.是origin的缩写
2.若无org默认程序从cs:0开始存放指令代码
3.两个org指令之间空余的空间用0填充
org offsetVal
xlat转换表指令1.BX存放表的首地址,AL存放当前表中元素的偏移量
2.不影响F的状态
xlat ;无需操作数

2.2 循环移位指令

循环移位指令非常容易混淆,但是却十分重要,因此需要牢牢记住并时常查阅此表。

指令作用注意事项示例
SHL逻辑左移指令1.最高位进入CF中
2.最低位直接用0填充
SHL AH,1
SHR逻辑右移指令1.最低位进入CF中
2.最高位直接用0填充
SHR BX,1
SAL算术左移指令行为与SHL没有差别SAL BL,CL
SAR算术右移指令1.最低位进入到CF中
2.最高位右移后填充最高位(即用最高位填充最高位)
SAR CL,BX
ROL循环左移指令最高位进入到CF中并填充最低位同上
ROR循环右移指令最低位进入到CF中并填充最高位同上
RCL带进位循环左移指令1.最低位由CF填充
2.最高位进入CF
同上
RCR带进位循环右移指令1.最高位由CF填充
2.最低位进入CF
同上

2.3 数据串操作指令

重复前缀指令与数据串操作指令连用常常能起到事半功倍的效果,注意使用了大大提升汇编程序的简洁性。

指令作用注意事项示例
lods/lodsw/lodsb载入数据串指令1.具体操作:从ds:si读取一个字节/字/双字到AL,AX,EAX中,SI根据DF的值进行增减对应的数值lodsw ;无需操作数
stos/stosw/stosb存数据串指令1.AX/AL的内容存放到ES:DI中
2.指针修改是自动且隐式的
stos/stosw/stosb ;无需操作数
cmps/cmpsb/cmpsw数据串比较指令cmps需要两个操作数(数据串首地址),后两个无需操作数,字符串的比较由DI和SI完成;NULL
movs/movsb/movsw数据串传送指令注意事项参照上方的cmps等的用法;NULL
rep/repz/repnz重复前缀指令1.当cx的内容不为0时执行操作(先判断)
2.用CLD,STD控制增、减量修改
3.与数据串操作指令结合使用,实现内存拷贝、比较等功能
不需要操作数

2.4 逻辑运算指令

这一部分指令是以我的理解进行划分,所以可能不太精准,有意见欢迎在评论区提出。

指令作用注意事项示例
cmp dest,src1.比较指令1.用dest减去src,但不保存结果
2.相减的结果影响F
cmp ax,cx
test dest,src1.将dest与src相与可用来测试是否为零等,结果不保存
2.影响F
test ax,ax
neg dest取补指令,得到相反数影响Fneg ax
not dest取反指令1.将操作数每一位按位取反
2.不影响F
not AX

2.5 基于大小关系的跳转指令

在使用了cmp,sub,subb等指令后通常使用如下这些指令衔接以便进行下一步的操作,令程序十分简洁。需要注意的是,根据有符号和无符号数需要选择不同的指令进行基于大小关系的跳转。

无符号数
指令作用
JA label大于时跳转
JAE label大于等于时跳转
JB label小于时跳转
JBE label小于等于时跳转
带符号数
指令作用
JG label大于时跳转
JGE label大于等于时跳转
JL label小于时跳转
JEL label小于等于时跳转
无符号、带符号通用
JE label等于时跳转
JNE label不等于时跳转

2.6 基于单标志位的转移指令

根据标志寄存器F中标志位的状态决定是否进行跳转,通常在进行运算后结合这些指令进行跳转。

指令作用
JC labelCF=1时跳转
JNC labelCF=0时跳转
JZ labelZF=1时跳转
JNZ labelZF=0时跳转
JO labelOF=1时跳转
JNO labelOF=0时跳转
JS labelSF=1时跳转
JNS labelSF=0时跳转
JP labelSF=1时跳转
JNP labelPF=0时跳转

Part 3:Loading… …

第一次更新:2020-05-15 15:29
第二次更新:2020-05-22 00:14
第三次更新:2020-05-24 00:24
第四次更新:2020-05-24 21:10

持续更新中… …

到此这篇关于汇编语言:x86汇编指令大全及其注意事项的文章就介绍到这了,更多相关x86汇编指令大全内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

标签:
x86 汇编指令

相关文章

汇编语言 跳转指令与C语言的条件分支

这篇文章主要介绍了汇编语言 跳转指令与C语言的条件分支,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

X86汇编调试环境搭建的过程

本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以使用masm插件),还有一个hexdump for VSCode。 安装NASM,并添加到环境变量,下面看下X86汇编调试环境搭建的过程吧

汇编语言LDR指令和LDR伪指令详解

这篇文章主要介绍了汇编语言LDR指令和LDR伪指令详解,伪指令是用来自动拆分代码值的,会把一条语句拆分成多条语句,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一文掌握汇编语言 halt 命令

汇编 halt 命令,是一条重复执行指定标号的循环命令。处理器暂停,直到出现中断或复位信号才继续,这篇文章主要介绍了汇编语言 halt 命令,需要的朋友可以参考下

VScode配置8086汇编环境的过程解析

这篇文章主要介绍了VScode配置8086汇编环境的过程解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

返回分类 返回首页