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 来自输入的程序集最大值_Assembly_X86 - Fatal编程技术网

Assembly 来自输入的程序集最大值

Assembly 来自输入的程序集最大值,assembly,x86,Assembly,X86,简单的汇编程序,可以吐出两个用户输入数中较大的一个。我很难得到正确的输出。例如,如果我输入45和55,最大值将是55,但是当我尝试反向输入55和45(答案仍然应该是55)时,我得到45。该程序似乎只输出在EAX中输入和存储的第二个值。非常感谢您的帮助 .586 .MODEL FLAT INCLUDE io.h .STACK 4096 .DATA value1 DWORD ? value2 DWORD ? prompt1 BYTE "Enter the first number", 0 p

简单的汇编程序,可以吐出两个用户输入数中较大的一个。我很难得到正确的输出。例如,如果我输入45和55,最大值将是55,但是当我尝试反向输入55和45(答案仍然应该是55)时,我得到45。该程序似乎只输出在EAX中输入和存储的第二个值。非常感谢您的帮助

.586
.MODEL FLAT

INCLUDE io.h

.STACK 4096

.DATA
value1 DWORD ?
value2 DWORD ?

prompt1 BYTE "Enter the first number", 0
prompt2 BYTE "Enter the second number", 0
string BYTE 40 DUP (?)

resultLbl BYTE  "The maximum value you entered was:", 0

.CODE

_MainProc PROC      
input prompt1, string, 40       ;get user input value1
atod string                     ;convert input (ASCII) to integer
mov ebx, eax

input prompt2, string, 40   ; repeat for value2
atod string
mov value2, eax

cmp eax, ebx                ;compare user inputs

jg greater_than     ;jump conditional if value 1 is greater then value 2

    greater_than:   ;condition if greater than ouput
        dtoa value1, eax                    ;decimal to ASC for output of 
integer value stored at ebx
        output  resultLbl, value1           ;output value 1
            jmp exit                    

    less_than:  ;condition if less than ouput
        dtoa value1, eax
        output  resultLbl, value2           ;else output value 2    
            jmp exit

    exit:   ;quit jump              ;end if/else conditional

    mov eax, 0          ;clear memory
    mov ebx, 0
    ret
_MainProc ENDP
END

问题在于指令的顺序。即使操作数1小于操作数2,唯一的区别是
jg大于
不会导致显式跳转到
大于
标签。但是,下一组指令是打印操作数1,也就是说,执行控制将进入“内部”
大于标签。为什么?这是因为下一条指令
dtoavalue1,eax
正好在
jg之后大于
。那么,你现在看到问题了吗?如果操作数1小于操作数2,则不会阻止打印操作数1。代码所做的全部工作是确保程序在操作数1>操作数2时确实打印
value1

您的代码相当于以下C代码:

if (op1>op2)goto gt;
gt: 
printf("%d",op1);
exit(0);

lt:
printf("%d",op2);
exit(0);
而你的意图是做以下事情:

if(op1>op2){
 printf("%d",op1);
 exit(0);
}

printf("%d",op2);
exit(0);
要解决此问题,您必须更改指令顺序,如下所示:

jg greater_than     ;jump conditional if value 1 is greater then value 2

    less_than:  ;condition if less than ouput
        dtoa value1, ebx
        output  resultLbl, value1           ;else output value 2    
            jmp exit

    greater_than:   ;condition if greater than ouput
        dtoa value1, eax                    ;decimal to ASC for output of integer value stored at eax
        output  resultLbl, value1           ;output value 1
            jmp exit

上述代码通过显式跳转到
大于
标签,确保在操作数1>操作数2时,防止执行
小于
标签内的代码。当操作数1时,问题在于指令顺序。即使操作数1小于操作数2,唯一的区别是
jg大于
不会导致显式跳转到
大于
标签。但是,下一组指令是打印操作数1,也就是说,执行控制将进入“内部”
大于标签。为什么?这是因为下一条指令
dtoavalue1,eax
正好在
jg之后大于
。那么,你现在看到问题了吗?如果操作数1小于操作数2,则不会阻止打印操作数1。代码所做的全部工作是确保程序在操作数1>操作数2时确实打印
value1

您的代码相当于以下C代码:

if (op1>op2)goto gt;
gt: 
printf("%d",op1);
exit(0);

lt:
printf("%d",op2);
exit(0);
而你的意图是做以下事情:

if(op1>op2){
 printf("%d",op1);
 exit(0);
}

printf("%d",op2);
exit(0);
要解决此问题,您必须更改指令顺序,如下所示:

jg greater_than     ;jump conditional if value 1 is greater then value 2

    less_than:  ;condition if less than ouput
        dtoa value1, ebx
        output  resultLbl, value1           ;else output value 2    
            jmp exit

    greater_than:   ;condition if greater than ouput
        dtoa value1, eax                    ;decimal to ASC for output of integer value stored at eax
        output  resultLbl, value1           ;output value 1
            jmp exit

上述代码通过显式跳转到
大于
标签,确保在操作数1>操作数2时,防止执行
小于
标签内的代码。当操作数1如Mayank Verma所述,如果在该指令之后立即跳转“jg大于”,即使在EAX EBX条件下,也不会执行跳转到小于。“小于”标签可以删除。你应该写:

    CMP EAX,EBX
     JG greater_than

;less_than
   dtoa value1, eax
 output resultLbl, value2
    jmp exit

greater_than:
integer value stored at ebx
 output resultLbl, value1

exit:
但我有一个新的解决方案。这是一个优化的最大(a,B)函数:

;  INPUT: EAX, EBX
; OUTPUT: EAX <- The maximum value between EAX, EBX

   CMP EAX,EBX
 CMOVL EAX,EBX
;输入:EAX,EBX

; 输出:EAX如Mayank Verma所述,如果在该指令之后立即跳转“jg大于”,即使在EAX EBX条件下,也不会执行跳转到小于。“小于”标签可以删除。你应该写:

    CMP EAX,EBX
     JG greater_than

;less_than
   dtoa value1, eax
 output resultLbl, value2
    jmp exit

greater_than:
integer value stored at ebx
 output resultLbl, value1

exit:
但我有一个新的解决方案。这是一个优化的最大(a,B)函数:

;  INPUT: EAX, EBX
; OUTPUT: EAX <- The maximum value between EAX, EBX

   CMP EAX,EBX
 CMOVL EAX,EBX
;输入:EAX,EBX

; 输出:EAX3个输入值。这看起来有用吗

.586
.MODEL FLAT

INCLUDE io.h

.STACK 4096

.DATA
value1 DWORD ?
value2 DWORD ?
value3 DWORD ?

titleLbl BYTE   "MAXIMUM NUMBERS",0
formula BYTE "Taking any THREE random user input numbers, this program can 
determine which of those numbers is greater.",0

prompt1 BYTE "Enter the first number",0
prompt2 BYTE "Enter the second number",0
prompt3 BYTE "Enter the third number",0
string BYTE 40 DUP (?)

resultLbl BYTE  "The maximum value you entered was:", 0
max_value BYTE 11 DUP (?), 0

.CODE

_MainProc PROC  
output titleLbl, formula

input prompt1, string, 40       ;get user input value1
atod string                     ;convert input (ASCII) to integer
mov ebx, eax

input prompt2, string, 40   ; repeat for value2
atod string
mov ecx, eax

input prompt3, string, 40   ; repeat for value2
atod string
mov value3, eax

cmp ebx, ecx                ;compare user inputs

jg greater_than     ;jump conditional if value 2 is greater then value 3

less_than:  ;condition if less than ouput
    cmp eax, ecx

    jg greater_than_again   ;jump conditional if 2 is greater than 1

    less_than_again: 
        dtoa max_value, ecx
        output  resultLbl, max_value          ;else output value 2    
        jmp exit

    greater_than_again:
    dtoa max_value, eax                    ;decimal to ASC for output of 
 integer value stored at eax
    output  resultLbl, max_value           ;output value 1
        jmp exit

greater_than:   ;condition if greater than ouput
    cmp eax, ebx

    jg greater_than_again   ;jump conditional if 2 is greater than 1

    less_than_again2: 
        dtoa max_value, ebx
        output  resultLbl, max_value          ;else output value 2    
        jmp exit

    greater_than_again2:
    dtoa max_value, eax                    ;decimal to ASC for output of 
 integer value stored at eax
    output  resultLbl, max_value           ;output value 1
        jmp exit

    exit:   ;quit jump              ;end if/else conditional

    mov eax, 0          ;clear memory
    mov ebx, 0
    mov ecx, 0
    ret
 _MainProc ENDP
 END

输入3个值。这看起来有用吗

.586
.MODEL FLAT

INCLUDE io.h

.STACK 4096

.DATA
value1 DWORD ?
value2 DWORD ?
value3 DWORD ?

titleLbl BYTE   "MAXIMUM NUMBERS",0
formula BYTE "Taking any THREE random user input numbers, this program can 
determine which of those numbers is greater.",0

prompt1 BYTE "Enter the first number",0
prompt2 BYTE "Enter the second number",0
prompt3 BYTE "Enter the third number",0
string BYTE 40 DUP (?)

resultLbl BYTE  "The maximum value you entered was:", 0
max_value BYTE 11 DUP (?), 0

.CODE

_MainProc PROC  
output titleLbl, formula

input prompt1, string, 40       ;get user input value1
atod string                     ;convert input (ASCII) to integer
mov ebx, eax

input prompt2, string, 40   ; repeat for value2
atod string
mov ecx, eax

input prompt3, string, 40   ; repeat for value2
atod string
mov value3, eax

cmp ebx, ecx                ;compare user inputs

jg greater_than     ;jump conditional if value 2 is greater then value 3

less_than:  ;condition if less than ouput
    cmp eax, ecx

    jg greater_than_again   ;jump conditional if 2 is greater than 1

    less_than_again: 
        dtoa max_value, ecx
        output  resultLbl, max_value          ;else output value 2    
        jmp exit

    greater_than_again:
    dtoa max_value, eax                    ;decimal to ASC for output of 
 integer value stored at eax
    output  resultLbl, max_value           ;output value 1
        jmp exit

greater_than:   ;condition if greater than ouput
    cmp eax, ebx

    jg greater_than_again   ;jump conditional if 2 is greater than 1

    less_than_again2: 
        dtoa max_value, ebx
        output  resultLbl, max_value          ;else output value 2    
        jmp exit

    greater_than_again2:
    dtoa max_value, eax                    ;decimal to ASC for output of 
 integer value stored at eax
    output  resultLbl, max_value           ;output value 1
        jmp exit

    exit:   ;quit jump              ;end if/else conditional

    mov eax, 0          ;clear memory
    mov ebx, 0
    mov ecx, 0
    ret
 _MainProc ENDP
 END

调试它。ebx很可能在函数调用中被覆盖。将其存储在内存中,而不是存储在register@SamiKuhmonen根据以下链接,
输入
不会影响任何寄存器:从链接引用:输入宏仅更改指定目标处的内存。它不会更改任何寄存器内容,包括标志寄存器。调试它。ebx很可能在函数调用中被覆盖。将其存储在内存中,而不是存储在register@SamiKuhmonen根据以下链接,
输入
不会影响任何寄存器:从链接引用:输入宏仅更改指定目标处的内存。它没有改变任何登记内容,包括标志登记。感谢帮助,我有C++的一些经验,所以我理解的逻辑,是在汇编中的实现,好像是绊倒了我。我怎么可以把它合并到检查3个数字?谢谢帮助,我有C++的一些经验,所以我理解的逻辑,似乎是汇编中的实现绊倒了我。我怎么能把它合并起来检查3个数字?这应该是问题的正确答案吗?你把它作为一个答案贴了出来。我想这可能是一个新问题,因为你说“这个看起来有用吗?”。你通常不是这样开始回答的。如果你已经测试过这个,并且它可以工作,那很好。是的,我知道,我使用了错误的链接来添加评论。下次我会改正的。谢谢你的帮助。这应该是这个问题的正确答案吗?你把它作为一个答案贴了出来。我想这可能是一个新问题,因为你说“这个看起来有用吗?”。你通常不是这样开始回答的。如果你已经测试过这个,并且它可以工作,那很好。是的,我知道,我使用了错误的链接来添加评论。下次我会改正的。谢谢你的帮助。