Assembly 在汇编中将16位值扩展为32位形式以及有关U2代码的问题
最近我在这里问了一个问题,但问得不恰当。我读了很多书,但有些东西我还是不完全理解,但从一开始:Assembly 在汇编中将16位值扩展为32位形式以及有关U2代码的问题,assembly,x86,dos,Assembly,X86,Dos,最近我在这里问了一个问题,但问得不恰当。我读了很多书,但有些东西我还是不完全理解,但从一开始: 我收到了用汇编(.COM)编写的程序代码。将两个整数相加。两个数字必须在[-32768..32767]范围内。在U2代码中,这两个数字必须从字符格式转换为16位格式。但是,此加法的结果必须是32位的,也在U2中(使用32位寄存器) 这段代码几乎有150行,所以我可能只包含这段代码的一部分。我必须很好地理解每一行。我可以描述其中的大部分,但仍不能完全理解某些台词。(我不懂的行用粗体表示) 首先:
我收到了用汇编(.COM)编写的程序代码。将两个整数相加。两个数字必须在[-32768..32767]范围内。在U2代码中,这两个数字必须从字符格式转换为16位格式。但是,此加法的结果必须是32位的,也在U2中(使用32位寄存器)
这段代码几乎有150行,所以我可能只包含这段代码的一部分。我必须很好地理解每一行。我可以描述其中的大部分,但仍不能完全理解某些台词。(我不懂的行用粗体表示) 首先:
.386p
.MODEL TINY
Code SEGMENT USE16
ORG 100h
.
Sign db 0
.
Start:
**mov byte ptr [Sign], 0** ;Do I understand correctly that we set the high bit to 0 here? As positive by default
xor ax, ax
push ax
;here (Adding: ) I understand everything, addition of 2 numbers is done and some conditions
Adding:
pop ax ;second number
pop bx ;first number
add ax, bx ;adding
jo Overflow_Flag
js Sign_Flag
jmp On_ASCII ;convert to ASCII
But I don't understand this following thing. When the result of this addition is negative, we "jump" to the Sing_Flag label and ...
Sign_Flag :
**mov ebx, 0ffff0000h** ;Why are we writing mov ebx, 0ffff0000h here?
add ebx, eax ;further I understand
neg ebx
mov dl, '-'
mov ah, 02h
int 21h
mov eax,ebx
jmp On_ASCII
我想介绍一下我对它的理解:FFFF0000h=11111111111111000000
通过这一行,我们将16位值扩展为32位形式。 例如,此加法的结果为:-5,因此:
5=0101(箱)
负(0101)+1=1010+1=1011=-5(十二月)
因此,在这种情况下: 0000 0000 1111111111111111111011(负ebx)
这就是我不理解/找不到的信息:
谢谢大家!李>
第一条粗体线将变量
符号
初始化为零。它不再在您所展示的代码片段中使用,因此很难说出它的用途
mov ebx, 0ffff0000h** ;Why are we writing mov ebx, 0ffff0000h here?
add ebx, eax ;further I understand
neg ebx
这是从
AX
加载绝对值的EBX
的不同寻常的方式。(我会使用MOVSX-EBX,AX
)。如果AX
中的加法结果为负(-5),它将跳转到符号标志:
,在EAX
的上半部分有未定义的垃圾。让我们假设它在添加之前被清除,然后将它添加到EBX=0FFFF\u0000h
,现在您有了EBX=0FFFF\ufffbh
,即-5。在NEG EBX
之后,它给出EBX=0000_0005h
,该值将(连同DL中的减号)通过ASCII上的发送到输出上第一条粗体线将变量符号初始化为零。它不再在您所展示的代码片段中使用,因此很难说出它的用途
mov ebx, 0ffff0000h** ;Why are we writing mov ebx, 0ffff0000h here?
add ebx, eax ;further I understand
neg ebx
这是从AX
加载绝对值的EBX
的不同寻常的方式。(我会使用MOVSX-EBX,AX
)。如果AX
中的加法结果为负(-5),它将跳转到符号标志:
,在EAX
的上半部分有未定义的垃圾。让我们假设它在添加之前被清除,然后将它添加到EBX=0FFFF\u0000h
,现在您有了EBX=0FFFF\ufffbh
,即-5。在NEG EBX
之后,它给出EBX=0000_0005h
,该值将(连同DL中的减号)通过ASCII上的发送到输出上您是否假设EAX的高16位为零?问题中的此代码无法确保add等同于mov bx,ax
。但是是的,这看起来像是手动在符号扩展上加上负数,然后求反(在仅当AX为负数时运行的块中)。(是的,movsx ebx,ax
/neg ebx
.movsx本身并不等同于这个3指令块)您是否假设EAX的高16位为零?问题中的此代码无法确保add等同于mov bx,ax
。但是是的,这看起来像是手动在符号扩展上加上负数,然后求反(在仅当AX为负数时运行的块中)。(是的,movsx-ebx,ax
/neg-ebx
.movsx本身并不等同于这个3指令块)