处理器 缓存 内存 指令集 运算器 控制器
主页 正文

8086汇编语言加减乘除编程入门教程

汇编语言(8086)最简单加减乘除编程;定义A,B 使C=A+B D=A-B E=A*B F=A/B 符号有DB DW

根据您的要求:“信号包括DBDWDDCXSISHLSHRMOVADDSTACKDATA等” 如果所有指令都有的话,执行A+B、A-B、A*B、A/B等操作会比较简单。
首先定义A和B的值,比如用DB定义16位数据类型,那么可以这样定义: DBAequ0001hDBBequ0002h 然后计算C=A+B,使用ADD指令增加加法。
运算:ADDC,B 计算D=A-B,使用SUB 指令进行减法:SUBD,B 计算E=A*B。
8086汇编语言中没有直接的乘法指令,但可以通过循环和加法来完成:MULBMOVE、AX计算F=A/B,并使用DIV指令进行除法:MOVAX、AMOVBX、BDIVBXMOVF、AL中上面的代码示例A和B定义为16位数据类型,C、D、E和F也使用16位数据类型 受访者 通过这些基本运算,可以完成加、减、乘、除的计算。
需要注意的是,8086汇编语言中的数据格式和用法非常重要。
另外,还可以使用栈(stack)来临时存储中间结果,如:MOVAX、AMOVBX、BPUSHAXPUSHBXPOPCXPOPDX。
这是利用8086汇编语言进行简单加减乘除运算的基本方法。

关于王爽的汇编语言的加减乘除指令

汇编算术指令 8086 算术指令可以进行二进制或十进制数(BCD 代码)的加、减、乘、除运算。
操作数的数据格式可以是8位或16位无符号或有符号数。
对于单操作数指令,不允许使用立即数格式。
对于双操作数指令,只有源操作可以使用立即数,并且两个操作数之一必须位于寄存器中。
1. 加法指令 指令格式:加法 ADDDST, SRC; (DST) ← (SRC) + (DST) 带进位加法 ADCDST, SRC; (DST) ← (SRC) + (DST) + CF 加 1INCOPR (OPR) + 1 注:这3条指令的结果影响状态标志位,但INC指令不影响标志CF。
下面以8位加法运算为例进行简单说明。
[例 4.20] CF=0 表示运算结果未超出半角无符号数范围,OF=1 表示运算结果未超出半角有符号数范围,其他标志 ZF=0、SF = 1. 以上操作可以用两条指令来实现。
MOVAH、01ADDAH 和 7FHADC 指令主要用于多字节或多精度数据的加法运算。
例如,如果要使用 1 字节加法指令将两个 4 字节(双精度)数字 11223344H 和 55667788H 相加,则运算过程中需要执行四次加法运算。
当使用字加指令时,低位字操作产生的进位也必须由 ADC 指令处理。
要使用 ADC 指令,必须首先将 CF 标志设置为 0。
2、减法指令的指令格式:减法SUBDST,SRC;(DST)←(DST)-(SRC)带进位减法SBBDST,SRC;(DST)-(SRC)-CF减1DECOPR; -1的补码 NEGOPR)←0FFFFH-(0PR)+1 CMPOPR1, OPR2; 比较;(OPR1)-(OPR2) SBB指令主要用于多字节或多精度数据的减法运算,以及进行反转和加1运算。
; CMP 指令执行与 SUB 指令类似的减法运算,但对标志位的影响如表 4.3 所示。
所有这些指令的结果都会影响状态标志位,但 DEC 指令不会影响 CF 标志。
【例 4.22】 直接减法运算结果为 (4006AH) = 520FH, SF = 0, ZF = 0, CF = 0, OF = 0,补码加法运算结果为 (4006AH) = 520FH, SF = 。
0、ZF=0、CF=1、OF=0 计算公式中,FECAH 为(-0136H)的补码。
可以看到,两次计算的结果是一样的,但是对标志CF的影响是不同的。
由于这是一个减法运算,所以正确的结果应该是CF=0。
利用补码加法得到运算结果CF=1。
这需要被反转并发送到CF。
表4-3 CMP 指令对状态标志位的影响 3. 乘法指令 乘法运算分为无符号和有符号数值运算,每种运算都有相应的指令并使用双操作数。
当两个 8 位二进制数相乘时,乘积是一个 16 位二进制数,当两个 16 位二进制数相乘时,乘积是一个 32 位二进制数。
指令格式: 无符号数值乘法 MULSRC; (AX) ← (AL) × (SRC) 8 位乘法 (DX, AX) ← (AX) × (SRC) 16 位乘法 有符号数值乘法 IMULSRC;同上,但是,操作数是有符号数。
注:执行字节操作时,目的操作数为累加器 AL进行字操作时,目的操作数必须是累加器AX。
该产品必须存在于寄存器 DX、AX 中。
源操作数不允许立即寻址。
乘法指令的结果只影响状态标志CF和OF,不影响其他状态标志(状态不确定)。
对于 MUL 指令,如果字节数据乘积 (AH) = 0 或字数据乘积 (DX) = 0,则 CF=OF=0,否则对于 IMUL 指令,CF=OF=1。
字节数据与AH或字的乘积如果数据乘法DX的乘积为符号扩展的下半部分,则CF=OF=0,否则CF=OF=1。
4. 除法指令 除法运算分为无符号数运算和有符号数运算。
它有自己相应的指令并使用双操作数。
如果除数是8位或16位二进制,则被除数必须是16位或32位二进制。
指令格式:无符号除法DIVSRC;(AL)←(AX)/(SRC)8位二进制除法商(AH)←(AX)/(SRC)8位二进制除法余数或(AX)←(DX,AX )/(SRC) 16 位二进制除法 (DX) ← (DX, AX)/(SRC) 16位二进制法的剩余部分是有符号除法IDIVSRC。
操作与上面相同,但操作数是有符号数。
注意:如果除数是字数据,被除数必须放在AX中。
股息必须存入 AX。
除法指令的结果没有定义状态标志(状态不确定)。
但是,如果除数为 0 或有符号数,则除法结果超出指定范围时,无论溢出标志 OF 为何,都会发生中断号 0。
8086/8088规定IDIV指令运算结果余数的符号与被除数相同。
在有符号除法运算中,如果被除数没有足够的位数,则必须将被除数扩展到所需的位数。
8086/8088 已签署号码扩展命令。
指令格式:字节扩展到字CBW,字将寄存器AL 的符号位扩展到寄存器AH,将寄存器AX 的符号位扩展到寄存器DX。
5、十进制调整指令 BCD 码是十进制数的二进制编码,也称为二进制十进制数。
8086/8088 BCD 码分为两种格式:一种称为压缩 BCD 码的格式,使用 4 位二进制数,另一种格式使用 8 位二进制数。
十进制数称为非数字代码。
低4位为BCD码,高4位无意义。
由于BCD码是4位二进制码,所以共有16个4位二进制码,其中仅使用了10个,其​​余无用的代码称为无效代码。
如果 BCD 码计算结果落入无效代码区或被跳过,则会发生错误。
可能需要进行调整才能获得正确的结果。
8086/8088对于压缩和未压缩BCD码有两套小数点调整指令,调整方法略有不同。
(1) 压缩 BCD 码小数调整命令 命令格式: 加小数调整 DAA(AL) ← 调整 AL 之和为压缩 BCD 码格式 减小数调整 DAS(AL) ← 调整 AL 与压缩 BCD 码格式之差 格式调整方法即累加器AL的低4位为9或若辅助进位标志AF=1,则将累加器AL 加06H 进行补偿。
如果累加器 AL 的高 4 位大于 9 或进位标志 CY=1,则累加器 AL 加 60H 进行修正。
如果累加器AL的高4位大于或等于9且低4位大于9,则累加器AL通过添加66H来校正。
【例 4.26】BCD 码加法运算 59+68=127 本例中,BCD 码加法结果低 4 位 AF=1,高 4 位大于 9,所以加上 66H 来修正我会的。

注:压缩 BCD 码加法或减法十进制调整指令必须在 ADD (ADC) 或 SUB (SBB) 指令之后使用。
调整结果不影响OF标志,但影响其他状态标志位。
通过减法调整小数与通过加法调整小数类似,只不过将 6 的加法改为 6 的减法。

汇编语言AND指令

8086 汇编手册 1. 数据传输指令 这些指令在存储器和寄存器、寄存器和输入输出端口之间传输数据。
1. 一般数据传输指令 MOV 首先传输字或字节,然后传输零扩展。
首先,PUSH 传输将字压入堆栈。
POP 从堆栈中弹出一个单词。
SHA 依次将 AX、CX、DX、BX、SP、BP、SI、DI 压入堆栈。
POPA 依次将 DI、SI、BP、SP、BX、DX、CX、AX 压入堆栈。
PUSHAD 按顺序放置 EAX。
ECX、EDX、EBX、ESP、EBP、ESI、EDI一一放入栈中。
POPAD EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX 按顺序出栈。
BSWAP 反转 32 位 XCHG 寄存器的字节顺序。
段寄存器不能用作操作数) CMPXCHG 比较并交换操作数(必须设置第二个操作数)。
对于AL/AX/EAX累加器),XADD先交换,然后累加(结果在第一个操作数中)索引值(0-255,即0-FFH); 返回 AL 作为表查找的结果。
[BX+AL]->AL) 2. 输入输出端子 INI/O 端口传输指令,输入端口(语法:IN 累加器,{端口号 │ DX}) OUTI/O 输出端口(语法:OUT { 端口号 │ DX},电池)输入和输出端口直接接触。
如果指定,其范围是0-255; 如果在 DX 寄存器中指定,则其范围为 0–65535.3。
LEA 传输命令加载有效地址。
示例:LEADX,字符串; 将偏移地址存储在DX中。
LDS 传递目标指针并将指针的加载到 DS 中。
示例:LDSSI,字符串; 存储段地址:DS中的偏移地址。
:SI.LES 传递目标指针并将指针的加载到 ES 中。
示例:LESDI,字符串; 将段地址:偏移地址存储到传输目标指针ES:DI.LFS中,并将指针的加载到FS中。
示例:LFSDI,字符串; 存储段地址:传输目标FS的偏移地址:DI.LGS。
index,将索引的加载到 GS 中。
例:LGSDI,放入段地址:offset; 地址存储在GS:DI中。
LSS传递目标指针,并将指针的加载到SS中。
例如:LSSDI,字符串; 段地址:标志传送指令中存放的偏移地址。
LAHF 标志寄存器被传输,该标志被加载到 AH.SAHF 标志寄存器中,并且发送后,AH 的被加载到标志寄存器中。
PUSHF 标志被压入堆栈。
POPF 标志从堆栈中弹出。
32 位 PUSHD 标志从堆栈中弹出。
2.算术运算指令。
———————————————————————————————————添加ADC并添加INC 1. ASCII码AAA。
添加 DAA 减法的小数调整。
借位DEC减1,减去SBB。
对NEC取反(两个操作数相减,仅改变标志位,不发送结果)。
后退)。
调整 AAS 减法的 ASCII 代码。
DAS 减法的小数调整。
无符号乘法 MUL。
整数乘法 IMUL。
方法。
对于以上两个元素,将结果发送回AH和AL(字节操作)或DX和AX(字操作),调整AAM无符号除法的ASCII码。
对于以上两种方法。
元素,返回结果:商返回AL,余数返回AH(字节运算)或商返回AX,余数返回DX(字运算)A; 调整AD分离的ASCII码。
将 CBW 字节转换为字(将 AL 中的字节符号扩展为 AH)。
将 CWD 字转换为双字(将 AX 中的字符号扩展为 DX)。
CWDE 将字转换为双字。

(AX 字符号扩展至 EAX)CDQ 双字符号扩展(EAX 字符号扩展)。
转至EDX) 3. 逻辑运算指令———————————————————————————————————————及AND运算.或运算。
.SAL 算术左移 (=SHL) SHR 算术右移 (=SHR) ROL 左移。
RCL 通过进位左转。
RCR 进位右移。
最多移动 255 次。
通过一次移位,可以直接使用操作码。
例如,SHLAX。
, 1. 当shift>1次时,移位次数由CL寄存器设置。
例如MOVCL、04SHLAX、CL 4. 字符串指令———————————————。
———————————————————— DS:SI 源行段寄存器:源行索引。
ES:DI 目标行段寄存器:目标行索引 CX 重复计数器地址。
AL/AX 扫描值。
D0标志表示SI和DI在重复操作过程中应自动增加; 1表明它们应该自动减少。
Z标志用于控制扫描或比较操作的完成。
.MOVS 字符串传输。
(MOVSB 传输字符。
MOVSW 传输字。
MOVSD 传输双字。
)CMPS 字符串比较。
(CMPSB 比较字符。
CMPSW 比较字。
) SCAS 字符串扫描。
将 AL 或 AX 的与目标字符串进行比较,比较结果反映在 LODS 标志位中。
项目(字或字节)。
在源行中一次加载一个。
加载到 AL 或 AX(LODSB 传输字符。
LODSW 传输双字。
)STOS 存储字符串。
如果 CX/ECX>0,则重复。
当ZF=1或比较结果相等时为REPE/REPZ,当ZF=0或比较结果不相等且CX/ECX>0时为REPNE/REPNZ。
重复。
当CF=1且CX/ECX>0时重复REPC。
当CF=0且CX/ECX>0时重复REPNC。
5. 程序传输命令。
——————————————————————————————————————————————— 1>无条件转移指令(长传送 ) JMP 无条件 CALL 传送指令过程调用 RET/RETF 过程并返回 2> 有条件传送指令(短传送,距离 -128 到 +127 内)(然后和 仅当 (SFXOROF)=1, OP1 当JAE/JNB大于等于时跳转。
当 JB/JNAE 小于或等于 JBE/JNA 时分支。
上述四个元素检查无符号整数的运算结果(C 和 Z 标志大于 pass)。
JGE/JNL 大于或等于透射率。
JL/JNGE小于齿轮。
大于或等于转移。
上述四个元素检查有符号运算的结果(S、O 和 Z 标志),当 JE/JZ 相等时跳转。
当 JNE/JNZ 不相等时跳转。
当JC有进位时转移。

当 JNO 不溢出时进行分叉。
.JNP/JPO 奇偶校验位为“0”时分支。
JP/JPE 分叉时 JS 奇偶校验位。
当它为“1”时转换。
3>循环控制命令(短传) LOOPCX 不为零时循环。
当LOOPE/LOOPZCX不为零且标志Z=1时循环。
当LOOPNE/LOOPNZCX不为零时循环并标记。
Z=0.JCXZCX 转换为零。
JECXZECX 设置为零。
4> INT 中断指令、INTO 中断指令、IRET 溢出中断。
中断返回 5> 处理器控制指令 HLT 处理器挂起直到出现中断或复位信号,导致CPU进入睡眠状态,此时芯片的TEST引脚转换为LOCK信号,阻塞总线。
空操作。
STC 设置进位标志。
CLC 清除进位标志。
STD 设置方向标志。
STI 标志位设置中断允许位。
CLI 清除中断允许位。
6. 伪指令———————————————————————————。
—— ————————DW 定义一个字(2 个字节)。
PROC 确定进程的终止。
ENDP 定义了一个段。
ASSUME 设置段的寻址。
ENDS 结束程序。

热门资讯
半导体基金现在还能买吗
8g设置虚拟内存数值
游戏怎么清除缓存数据
电鱼机主频混频对比强力哪个捕鱼效果更佳?
常见的汽车总线有哪些
cpu指令集有哪些
苏州新联伺服电机直销哪家好?
内存是指ram还是rom