汇编基础(三)
发布日期:2021-06-30 10:47:45 浏览次数:2 分类:技术文章

本文共 1357 字,大约阅读时间需要 4 分钟。

标志寄存器

指令的操作对象除了数据外还包括状态。在大多数情况下,使用标志寄存器中的标志来存储状态。

80*86的标志寄存器(EFLAGS)是一个32位的寄存器,实际只使用到15个二进制,一共14个标志。在此只说6个标志。

如下所示是80*86的标志寄存器的EFLAGS

 

1.C标志(进位/借位标志):加法/减法指令执行完后,最高位产生进位/借位,则C=1,否则C=0。

2.A标志(辅助进位/借位标志):加法/减法时,D3向D4位有进位/借位,则A=1,否则A=0。(当加法/减法为字或者双字时A标志的设置仅与最低一个字节中的D3位向D4位的进位/借位有关)

3.S标志(符号标志):S的标志记录运算结果的最高位的位值。如字运算后D15位为1,则S=1,否则S=0。有符号运算时,S标志是运算结果的符号位。

4.Z标志(全零标志):运算结果为全0时Z=1,否则Z=0。

5.P标志(奇偶标志):最低一个字节中1的个数,当1的个数为偶数时,P标志被设置为1,否则为0。当运算结果是字或双字时,P总与最后一个字节有关。

6.O标志(溢出标志):CPU根据判溢出电路对O标志进行设置,O=1时表示异常,O=0时表示无溢出。其逻辑表达式为:O=Xn-1*Yn-1*Zn-1的非+Xn-1的非*Yn-1的非*Zn-1(n为位数)

 

下面讲解下目标操作数的寻址方式源操作数的寻址方式和CPU所寻址的逻辑段

1.立即寻址:操作数是一个立即数(就是常数) 

例如:MOV AX,3100H 中的3100H

2.直接寻址:指令中给出的不是数值,而是操作数存放的物理地址(偏移地址)

例如:MOV AX,[5400H] 中的[5400H]

3.寄存器寻址:指令的操作数是CPU的内部寄存器

例如:MOV SI,AX 中的AX

4.寄存器间接寻址:用寄存器的内容表示操作数的偏移地址,同样,寄存器不再表示数值本身,而是操作数存放的物理地址(偏移地址),此方式只允许使用SI、DI、BX、BP

例如:MOV AX,[SI] 中的 [SI]

5.寄存器相对寻址(带位移的基址/变址寻址):与寄存器间接寻址相类似,只是偏移地址中多了一个给定的8位或16位位移量

例如:MOV AX,[BX+5] 中的[BX+5]

6.基址-变址寻址:由基址寄存器BX和BP中的任意一个和变址寄存器SI和DI中的任意一个相加而形成操作数的偏移地址

例如:MOV AX,[BX][DI] 中的[BX][DI]

7.基址-变址相对寻址(带位移的基址-变址寻址):与基址-变址寻址相类似,只是偏移地址中多了一个给定的8位或16位位移量

例如:MOV AX,[BX+DI+8] 中的[BX+DI+8]

记住一点,带有“[ ]”的,都是代表地址,而并非真正的数值.

至于逻辑段,主要针对的是源操作数的寻址.默认情况下,指令中只要没有出现BP,逻辑段是DS;出现了BP,逻辑段为SS

另外:

SP:基址寄存器(stack pointer),一般在函数中用来保存进入函数时的sp的栈顶基址

BP:  基数指针寄存器BP(base pointer)是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到

转载地址:https://it1995.blog.csdn.net/article/details/52760635 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:汇编基础(四)
下一篇:汇编基础(二)

发表评论

最新留言

很好
[***.229.124.182]2024年04月08日 02时14分12秒