首页 > 编程语言 >汇编语言-8086指令(上)

汇编语言-8086指令(上)

时间:2022-10-28 10:01:27浏览次数:54  
标签:8086 传送 汇编语言 操作数 ptr mem 指令 reg

数据传送指令

汇编语言中字母开头通常表示标识符(如常量、变量、标号),所以MASM规定十六进制数如果以字母开头需要添加前导0。

当目的操作数是存储单元,而源操作数既可以是字又可以是字节时,必须显式指明字节传送还是字传送,btye ptr or word ptr。

不允许段寄存器和段寄存器、段寄存器和立即数、以及存储单元和存储单元之间的数据传送,CS寄存器通过数据传送进行修改。

目的操作数和源操作数的类型必须一致。

 

通用数据传送指令

传送指令Mov

mov reg/mem, imm ; 立即数传送
mov reg/mem/seg reg ; 寄存器传送
mov reg/seg mem ; 存储单元传送
mov reg/mem seg ; 段寄存器传送

 

交换指令XCHG

xchg reg, reg/mem
xchg reg/mem

 

换码指令XLAT

bx指定段地址,al指定偏移地址,[bx + al]的数据存储在al中

xlat label ; 和第二种写法的效果是一样的,只不过这个可以明确说明缓冲区所在逻辑段的位置
xlat ; al<-ds:[bx + al]

 

堆栈操作指令

进栈指令PUSH

进栈指令先使堆栈指针(sp)减2,然后将一个字操作数存入堆栈顶部。(小端存储)

push r16/m16/seg 

 

出栈指令POP

出栈指令先将一个数传送至目的操作数,然后将堆栈指针(sp)加2

pop r16/m16/seg

 

堆栈基址指针bp默认与堆栈段寄存器ss配合,利用堆栈可以实现主、子程序传递参数、现场的保护和恢复以及其它汇编指令的实现等等。

 

标志传送指令

标志送AH指令LAHF

将状态标志位传送至AH

lahf

 

AH送标志指令SAHF

将AH传送至状态标志位

sahf

 

标志进栈指令PUSHF

堆栈指针sp减2,将状态标志位传送入栈中

pushf

 

标志出栈指令POPF

将栈顶字单元传送入标志寄存器,堆栈指针sp加2

popf

 

标志位操作指令

cl:复位,复0

st:置位,置1

; cf 进位标识
clc
stc
; df 方向标识
cld
std
; if 中断标识
cli
sti

 

地址传送指令

有效地址传送指令LEA

有效地址:ea

lea指令将存储单元的有效地址ea传送到指定寄存器

lea r16, mem

 

指针传送指令

LDS、LES指令分别将主存中mem指定的字送至R16,再将mem的下一个字送到ds或es。

其中si的默认段寄存器为ds(ds:si),di的默认段寄存器为es(es:di)

lds r16 mem
les r16 mem

 

算术运算类指令

状态标志

进位标志CF(Carry Flag)

无符号数加减运算结果的最高有效位有进位(加法)或借位(减法)时,CF=1;若没有,则CF=0。

 

溢出标志OF(Overflow Flag)

回忆:补码的加减运算

X(补)+ Y(补)= (X + Y)补

X(补)+ Y(变补)= (X - Y)补

变补:连同符号位取反加一

有符号数加减结果超出范围时,OF=1;若没有,则OF=0。

 

零标志ZF(Zero Flag)

运算结果为零时,ZF=1;若不为零,则ZF=0。

 

符号标志SF(Sign Flag)

运算结果的最高位为1时,SF=1;若最高位为0,则SF=0。

 

奇偶标志(Parity Flag)

最低八位的运算结果中,1的个数为偶数或零时,PF=1;若1的个数为奇数,则PF=0。

 

加法指令

加法指令ADD

源操作数和目的操作数相加,结果送到目的操作数

add reg, imm/reg/mem
add word/byte ptr mem imm/reg

 

带进位加法指令ADC

源操作数和目的操作数相加再加CF,结果送到目的操作数

adc reg, imm/reg/mem
adc word/ptr mem, imm/reg

实现无符号双字加法运算,默认ax低位,dx存高位,合计32位

mov ax, 4652h ; ax = 4652h
add ax, 0f0f0h ; ax = 3742h, cf = 1
mov dx, 0234h ; dx = 0234h
adc dx, 0f0f0h ; dx = f325h, cf = 0

 

增量指令INC

操作数自增1

inc reg
inc byte/word ptr mem

 

减法指令

减法指令SUB

源操作数和目的操作数相减,结果送到目的操作数

sub reg, imm/reg/mem
sub byte/word ptr mem, imm/reg

 

带借位减法指令SBB

源操作数和目的操作数相加再减CF,结果送到目的操作数

adc reg, imm/reg/mem
adc word/ptr mem, imm/reg

 

减量指令DEC

操作数自减

dec reg
dec byte/word ptr mem

 

求补指令NEG

对操作数进行求补运算,对于计算机而言,即用零减去操作数;对于人而言,即操作数取反加1。

neg reg
neg byte/word ptr mem

 

比较指令CMP

与减法指令基本相同,不同点是它不会把结果返回给目的操作数。

cmp reg, imm/reg/mem
cmp byte/word ptr imm/reg

比较AL是否大于100

cmp al, 100 
jb below ; al < 100, 跳转到below
jump else ; al >= 100, 跳转到else

 

乘法指令MUL/IMUL

无符号数乘法指令MUL,有符号数乘法指令IMUL。

乘法指令隐含使用一个操作数,它寄存在AX寄存器中。

若字节量相乘,则结果传入AX中,而如果AX中高八位不为零,则OF=CF=1;若字量相乘,则高位传入DX,低位传入AX,若DX不为零,则OF=CF=1;

mul/imul byte/word ptr mem/reg

 

除法指令DIV/IDIV

无符号数除法指令DIV,有符号数除法指令IDIV。

除法指令隐含使用一个操作数(被除数),它寄存在AX中。

先存商,在再存余数。如果除数是字节量,则商传入AL,余数传入AH;如果除数是字,则商传入AX,余数传入DX。

如果除法产生溢出,被除数远大于除数或者除数为0,则发生除法溢出,引发编号为0的内部中断。

div/idiv byte/word ptr mem/reg

 

符号扩展指令CBW/CWD

CBW:将AL的最高有效位D7拓展至AH,即假如AL的最高有效位(符号位)为0,则AH=00H;假如AL的最高有效位(符号位)为1,则AH=FFH。

CWD:将AX的最高有效位D15拓展至DX,即假如AX的最高有效位(符号位)为0,则DX=0000H;假如AX的最高有效位(符号位)为1,则DX=FFFFH。

cbw
cwd

例如:有符号数AX/BX

cwd
idiv bx

 

十进制调整指令

什么是压缩BCD码,什么是非压缩BCD码?

压缩BCD码:用4个二进制位表示一个十进制位,1个字节可以表示两个十进制位,即00-99。

非压缩BCD码:用8个二进制位表示一个十进制位,实际上只是用低四个二进制位表示一个十进制0-9,高四位任意,但通常默认为0。

 

非压缩BCD码也有对应的调整指令,但比较多,放弃了,不做记录。

 

压缩BCD码调整指令

DAA:跟在以AL为目的操作数的ADD或ADC指令后,对AL的二进制结果进行十进制调整。

DAS:跟在以AL为目的操作数的SUB或SBB指令后,对AL的二进制结果进行十进制调整

daa
das

例如:已知AX=1234H,BX=4612H,计算1234-4612的差

sub al, bl
das
xchg al, ah
sbb al, bh
das
xchg al, ah
 

 

标签:8086,传送,汇编语言,操作数,ptr,mem,指令,reg
From: https://www.cnblogs.com/LimeCoder/p/16834839.html

相关文章

  • [qt-everywhere-src-6.4.0 QtWebEngineCore] 在 arm64 上出现 paciasp autiasp ASM指
    编译最后一个巨型模块QtWebEngineCore遇到的。../../../3rdparty/chromium/third_party/breakpad/breakpad/src/common/linux/breakpad_getcontext.S:145:Error:sele......
  • VS2017调试代码显示变量值为无法获取本地变量或参数的值,因为它在此指令指针中不可用,可
    问题:最近在开发过程中,遇到在Debug模式进行断点调试中,监控你变量对象时看不到值,提示如下:“无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化......
  • 文件目录类指令
    文件目录类指令1、pwd指令基本语法:pwd(显示当前工作目录的绝对路径)2、ls指令基本语法:ls[选项][目录或是文件]常用选项:-a:显示当前目录所有的文件和目录,包括隐......
  • 前端项目管理器指令
    我之前把npm的代理设置为了淘宝镜像设置npmconfigsetregistryhttps://registry.npmmirror.com/获取npmconfiggetregistry然后在安装一个最新更新的包时,产生了......
  • Vue常用指令(精简)
    #Vue系列##el:挂载点demo01.html-vue实例作用范围:vue会管理el选项命中的元素及其内部的后代元素,可以使用其他选择器(class、el标签),建议使用id选择器,因为id是唯一的。......
  • [oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
    ​ 程序本质回忆上次内容我们把python源文件词法分析得到词流(tokenstream)语法分析得到抽象语法树(AbstractSyntaxTree)编译得到字节码(bytecode)......
  • Dockerfile指令说明
    Dockerfile1、FROM基础镜像,当前镜像是基于那个镜像的,指定一个已经存在的镜像作为模板2、MAINTAINER镜像维护者的姓名和邮箱地址3、RUN容器构建的时候需要运行的命......
  • linux运维管理常用指令
    发布时间  2022-10-26:15:37接上节<5分钟快速搭建nodejsweb应用>,我们部署完web应用后,就会遇到一些维护问题,比如外网无法访问,比如我们要重启,结束进程等等,本节重点列举几......
  • 写过vue自定义指令吗,原理是什么?
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......
  • 若依权限指令 v-hasPermi 如何在自定义组件中使用
    问题对于按钮权限,若依封装了自定义指令v-hasPermi,如下所示:点击查看代码/***v-hasPermi操作权限处理*/importstorefrom'@/store'exportdefault{ins......