有人能解释一下+-在汇编程序中是如何在寄存器中工作的吗?当我有代码时:
mov al, 2 mov bl, 4 mov cl, 100 mul cl add ah, bl mov al, 2 mov bl, 4 mov cl, 100 mul cl add ah, bl
最后,乘完后,在SASM中显示AL是-56,为什么?在二进制中是11001000,我知道这是一个令人上瘾的代码-56,但是我怎么知道它是这个而不是200呢?
1l5u6lss1#
大部分数据的数字表示只是供用户欣赏的(如-35、58或0xABCD等),通常计算机不关心数据的符号性。Two's complement在计算中非常常用。2的补码的基本原理是数据的MSB定义了“符号”--在您的示例中,0 b11001000的MSB是1,因此当表示该数据时,您的模拟器/机器/您用来查看该值的任何东西都会发出“哦,嘿,MSB中有一个1!让我们将其解释为负!”,然后通过反转数据可以计算出“真”值(现在是0 b 00110111)并加1(0 b 00111000),新值(十进制56)* 可以 * 用原始值的MSB(1,所以你可以认为它是负的)来解释,它可能显示为-56。数据的表示最终取决于你对数据执行的指令和操作的类型。还要注意你使用的是8位寄存器。同样,如果你使用的是N位大小的数据(在你的情况下,8位寄存器;您经常会看到16/32/64位寄存器),该寄存器的MSB * 可 * 用于确定符号。正如其他人所说,数据的解释取决于上下文,有些指令可能会将值解释为有符号/无符号(大量的数学运算),有些指令可能会完全忽略有符号,因为它与运算无关(如果你使用寄存器作为内存地址,如mov eax, [ebx+4])
mov eax, [ebx+4]
1条答案
按热度按时间1l5u6lss1#
大部分数据的数字表示只是供用户欣赏的(如-35、58或0xABCD等),通常计算机不关心数据的符号性。
Two's complement在计算中非常常用。2的补码的基本原理是数据的MSB定义了“符号”--在您的示例中,0 b11001000的MSB是1,因此当表示该数据时,您的模拟器/机器/您用来查看该值的任何东西都会发出“哦,嘿,MSB中有一个1!让我们将其解释为负!”,然后通过反转数据可以计算出“真”值(现在是0 b 00110111)并加1(0 b 00111000),新值(十进制56)* 可以 * 用原始值的MSB(1,所以你可以认为它是负的)来解释,它可能显示为-56。
数据的表示最终取决于你对数据执行的指令和操作的类型。还要注意你使用的是8位寄存器。同样,如果你使用的是N位大小的数据(在你的情况下,8位寄存器;您经常会看到16/32/64位寄存器),该寄存器的MSB * 可 * 用于确定符号。
正如其他人所说,数据的解释取决于上下文,有些指令可能会将值解释为有符号/无符号(大量的数学运算),有些指令可能会完全忽略有符号,因为它与运算无关(如果你使用寄存器作为内存地址,如
mov eax, [ebx+4]
)