使用汇编语言

时间:2018-03-30 16:29:44

标签: assembly

考虑

mov reg, 5

其中reg被认为是某个注册。此语句将值5复制到寄存器。

我的问题是:
如果提到的寄存器分为高低两部分,寄存器的哪一部分将存储该值以及为什么?

2 个答案:

答案 0 :(得分:1)

在x86中,mov始终加载整个寄存器。它加载指令中指定的寄存器。但是命名寄存器可能是另一个寄存器的一部分。例如,cx是ecx的低16位。

其他处理器架构还有其他方法可以加载部分寄存器。例如,MIPS有lui加载寄存器的上半部分。

答案 1 :(得分:1)

CPU中的寄存器通常用“位”实现,每个“位”从逻辑角度值0或1保持(除非你想谈论量子计算机,我会假设你的意思是像x86,ARM这样的常见CPU, Z80,......)。

汇编程序源中的整数值,如mov reg,5,然后在汇编过程中转换为二进制编码:5 = 0b101。如果目标reg是16位寄存器,则在执行该指令后,它将保持二进制值0000_0000_0000_0101(当被解释为十进制整数为“5”时)。现在,如果将16位寄存器分为高8位和低8位,则为0000_0000(高8位),0000_0101(低8位)。

在数学术语中, 16 位寄存器可以保存值(当位被解释为无符号整数值时),范围为0..65535(65535 = 2 16 -1)。如果它包含某个值 V ,则顶部 8 位包含值 V_high = V div 256 (256 = 2 8 ,“div”表示带截断结果的整数除法,而低 8 位包含值 V_low = V mod 256

将两个值组合回原始的16位值: V = V_high * 256 + V_low

或者从“位操作”函数的角度来看: V =(V_high <&lt; 8)| V_low 。 (将V_high移位到正确位置8位“左/上”后,将两个值进行运算)。并且 V_high = shr V,8 (通过右移做“div 256”), V_low = and V,0xFF (使用{{做“mod 256” 1}}清除高位并仅保留8个低位。)

在十六进制格式中,每个数字正好是4位“宽”,因此通过使用十六进制格式,您可以轻松地“看到”单个位设置,如0xA521 = 0b1010_0101_0010_0001,并且在将该值拆分为两个8位部分后,您将获得0xA5高8位,0x21低8位。 (0xA521 = 42273 = 165 * 256 + 33,165为0xA5,33为0x21)。

在回答你的问题时,两个寄存器将共同存储值5,一个存储其高位(全零),另一个存储其低位(仍为值5(位1_0_1),只要我们在谈论“部分“至少3位大小。”

还要注意寄存器如何只包含位值,没有别的。你如何解释这些(有符号/无符号整数,IEEE-754浮点数,16 0/1真/假布尔数组,或一些完全自定义的解释)取决于代码,它使用寄存器值。

例如32位值1095069860 = 0x414570a4 = 0b01000001010001010111000010100100在解释为32位整数(有符号和无符号)时大约为10亿,但是当您将这些位解释为32位IEEE 754“float”时,它意味着值{{ 1}}(最接近“12.34”的值,我确实输入了asm源)。寄存器本身不知道这些位应该是什么意思,下面的代码使用位值给出了含义。