Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在汇编中将16位值扩展为32位形式以及有关U2代码的问题_Assembly_X86_Dos - Fatal编程技术网

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)
这就是我不理解/找不到的信息:

  • 为什么是0ffff0000h而不是000000000h?这四个1是干什么用的
  • 汇编程序如何知道数字的“结束”在哪里?我们有1111111111011,为什么不算下一个1呢
  • 我是否理解mov字节ptr[Sign],0
    谢谢大家!
    第一条粗体线将变量
    符号
    初始化为零。它不再在您所展示的代码片段中使用,因此很难说出它的用途

    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指令块)