8080汇编指令
Posted 不会写代码的丝丽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8080汇编指令相关的知识,希望对你有一定的参考价值。
数据传送指令
(1)mov a,b
b的数据传送到a处,注意不能内存到内存中(会引起机器码过长,指令周期过长)
(2)xchg a,b
xchg是exchange, 也叫交换指令,效率高于mov 会使用暂存器。
示例
[1] xchg ax,bx
[2] xchg ax,[100]
(3) xlat
实际相当于执行下面汇编代码 mov al , ds:[bx+al]
xlat 是translate缩写
(4) push reg
将数值压入栈中(ss作为基地址,sp作为偏移) 相当于执行两条指令 (1) sub sp,2 (2) mov [sp],reg
(5) pop reg
将数值弹出栈中(ss作为基地址,sp作为偏移)相当于执行两条指令 (1) mov reg,[sp] (2) add sp,2
(6) LAHF
标志寄存器的低八位加载到AH中.LAHF(load ah with flag)
(7) SAHF
使用AH的寄存器值加载到标志寄存器中的第八位。SAHF(store AH)
(8)PUSHF
将标志寄存器的内容压入栈中,然后SP=SP-2。
(9)POPF
将栈的两个字节弹出给标志寄存器,然后SP=SP+2。
(10) LEA reg,[ea]
将ea赋值给reg寄存器。注意存储是ea,不是指向内存数值
注意看上面的示例图
lea ax,[ff]
执行后ax数值为ff
(11) LDS reg,mem
解释起来好像很麻烦看图把
(12) LES r16,mem
和LDS差不多只不过将放入DS数值改为ES上
(13) add
示例:
add reg,imm
add mem reg/imm
add word ptr[1],ax
add byte ptr[1],ax
会影响多个标志寄存器
(14) adc
和add用法基本一致,但是会考虑进位。
比如当前执行 adc ax,bx 之前进位标志位为1,那么运算结果会加上1.
如下图所示:
(15) inc
自增1,不影响CF标志位
(16) sub
sub reg,imm/reg/mem
sub mem,imm/reg
(17) sbb带借位的减法
语法和sub几乎一致,但是会将借位考虑到运算中。我们知道CF会在进位或者最高位借位时设置为1,在sbb计算时会将结果自动减少1
上面执行:
SBB AX,BX
AX = 23, BX = 11
正常情况下 AX=23-11=12
.但是CF为1因此会自动将12减1为11.
(18) DEC
自减1不影响CF寄存器
(19) neg
对数进行取反操作,比如1(补码0x0001
)取反为-1(补码0xffff
)。
1
进行neg
得到-1
-1
进行neg
得到1
(20) CMP
对两个进行减法计算,但是不存储结果但是影响标志寄存器
上面执行 CMP AX(0x),BX(0x0)
相当与执行 flag=0-0=0 因此运算结果得到0影响零标志位以及奇偶标志位。
(21) MUL
无符号乘法影响的标志位:CF
和OF
我们知道乘法是及其容易进位的,所以8086
汇编
位数 | 隐含的被乘数 | 结果存放位置 | 示例 |
---|---|---|---|
8bit | AL | AX | MUL BL |
16bit | AX | DX-AX | MUL BX |
32bit | EAX | EDX-EAX | MUL ECX |
8位:
16位:
标志位说明:
乘法会影响CF和OF排列组合可能有四种结果但是实际只有两种。
(1) CF=OF=1
(2) CF=OF=0
CF=OD=1 说明:
如果是8位乘法证明结果超过8位
如果是16位乘法结果超过16位
32位情况同上。
具体情况举例可以看上面56*10的举例图
(22) IMUL
有符号乘法语法和无符号乘法几乎一致
注意点:
第一位为符号位不参与运算,但是有可能进位引起溢出
正常情况如下:
溢出情况:
(22) div
无符号除法,除法暂时没有影响标志位
我们知道乘法是及其容易进位的,所以8086
汇编
位数 | 被除数 | 除数 | 商 | 余数 |
---|---|---|---|---|
8bit | AX | 8位ops | AL | AH |
16bit | DX,AX | 16位ops | AX | DX |
32bit | EDX,EAX | 32ops | EAX | EDX |
(23) idiv
有符号除法
位数 | 被除数 | 除数 | 商 | 余数 |
---|---|---|---|---|
8bit | AX | 8位ops | AL | AH |
16bit | DX,AX | 16位ops | AX | DX |
32bit | EDX,EAX | 32ops | EAX | EDX |
(24) CBW
CBW(covert byte to word)
将字节转化为字
将AL中的符号位移动到AH中。
(25) CWD
将字转为双字节
将AX中的符号位扩展至DX中,操作数是隐含且固定的。
(25) AND
按位与
影响标志位 SZ,ZF,PF,OF=CF=0
(26) OR
按位或
影响标志位SF,ZF,PF,OF=CF=0
(27) XOR
按位异或
影响标志位SF,ZF,PF,OF=CF=0
(28) NOT
按位取反,不影响标志位
(29) TEST
按位与,不存结果
影响标志位SF,ZF,PF,OF=CF=0
(30) SHL(shift logical left
)
逻辑左移动 完全等同SAL
- 左移动CNT位
- 高位进CF
- 低位补0
(31) SAR (shift arithmetic right
)
数算右移,最高位补符号位。移除的最后一位放入CF寄存区
举例:-4 右移动2位
(32) SHR(shift logical right
)
逻辑右移,最高位补0。移除的最后一位放入CF寄存区
举例:-4 右移动2位
举例:-4 右移动3位
移动的倒数第三位为1所以设置进位标志位
(33) ROL(rotate
)
循环左移
高位进CF
高位进位
(34) ROR
(循环右移动)
与RCR区别
举个例子:
0x80右移动1位:
81右移动一位
(35) RCL(carry)
带进位循环左移
(36)RCR(carry)
带进位循环右移
81右移动一位:
以上是关于8080汇编指令的主要内容,如果未能解决你的问题,请参考以下文章