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

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
无符号乘法影响的标志位:CFOF

我们知道乘法是及其容易进位的,所以8086汇编

位数隐含的被乘数结果存放位置示例
8bitALAXMUL BL
16bitAXDX-AXMUL BX
32bitEAXEDX-EAXMUL 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汇编

位数被除数除数余数
8bitAX8位opsALAH
16bitDX,AX16位opsAXDX
32bitEDX,EAX32opsEAXEDX

(23) idiv

有符号除法

位数被除数除数余数
8bitAX8位opsALAH
16bitDX,AX16位opsAXDX
32bitEDX,EAX32opsEAXEDX

(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

  1. 左移动CNT位
  2. 高位进CF
  3. 低位补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汇编指令的主要内容,如果未能解决你的问题,请参考以下文章

《Linux内核 核心知识全解析(完)》

8080_32位汇编-通用寄存器

汇编指令大全

16位汇编第五讲各种指令详解第一讲

汇编11:标志寄存器

装配 - 独立标签有什么作用?