汇编语言:使用十六进制的有符号与无符号整数表示
Assembly Language: Signed vs Unsigned Integer Representation using Hexadecimal
给定以下 MASM 汇编语言代码:
TITLE Move and add (AddSub.asm)
INCLUDE Irvine32.inc
INCLUDE macros.inc ; for memory dump
.data
x DWORD 0FFF4A348h ; summands
y DWORD 00076540h
z DWORD ? ; sum
.code
main PROC
mov ebx,x
mov eax,ebx
mov ecx,y
add eax,ecx
mov z,eax
call DumpRegs
mDumpMem offset x,12,1 ; Display data area
exit
main ENDP
END main
我的理解是DWORD是32位无符号数据类型。一旦整个程序为 运行,eax 寄存器将保存十六进制值 FFFC0888。此十六进制值可能产生两个可能的整数值,4,294,707,336 或 -259,960。根据我的教授的说法,正确的 Base 10 等效值是 -259,960。我对如何识别这个事实有点困惑。如果初始数据类型是无符号的,整数结果将为负数的赠品是什么?
CPU在加减整数时不关心操作数是有符号还是无符号,因为你得到的结果是一样的。这就是为什么 MUL
和 DIV
有签名和未签名版本,但 ADD
和 SUB
没有,所以答案是你想要的。如果您打算将两个无符号整数相加,则结果同样应该是无符号的。如果您打算将两个有符号整数相加,则应将结果解释为有符号。
简单地说,按照惯例,最重要的位是 1
意味着 如果数字被解释为带符号的整数 那么它是负数。完全相同的值可以解释为无符号整数。两种解读,两种结果。
作业细节包括一个非常重要的事实,它消除了关于如何得出所寻求答案的所有困惑:
"All of the data being manipulated is 32-bit, two's complement integer data."
给定以下 MASM 汇编语言代码:
TITLE Move and add (AddSub.asm)
INCLUDE Irvine32.inc
INCLUDE macros.inc ; for memory dump
.data
x DWORD 0FFF4A348h ; summands
y DWORD 00076540h
z DWORD ? ; sum
.code
main PROC
mov ebx,x
mov eax,ebx
mov ecx,y
add eax,ecx
mov z,eax
call DumpRegs
mDumpMem offset x,12,1 ; Display data area
exit
main ENDP
END main
我的理解是DWORD是32位无符号数据类型。一旦整个程序为 运行,eax 寄存器将保存十六进制值 FFFC0888。此十六进制值可能产生两个可能的整数值,4,294,707,336 或 -259,960。根据我的教授的说法,正确的 Base 10 等效值是 -259,960。我对如何识别这个事实有点困惑。如果初始数据类型是无符号的,整数结果将为负数的赠品是什么?
CPU在加减整数时不关心操作数是有符号还是无符号,因为你得到的结果是一样的。这就是为什么 MUL
和 DIV
有签名和未签名版本,但 ADD
和 SUB
没有,所以答案是你想要的。如果您打算将两个无符号整数相加,则结果同样应该是无符号的。如果您打算将两个有符号整数相加,则应将结果解释为有符号。
简单地说,按照惯例,最重要的位是 1
意味着 如果数字被解释为带符号的整数 那么它是负数。完全相同的值可以解释为无符号整数。两种解读,两种结果。
作业细节包括一个非常重要的事实,它消除了关于如何得出所寻求答案的所有困惑: "All of the data being manipulated is 32-bit, two's complement integer data."