2017-10-18 87 views
0

简单的装配程序可以吐出两个用户输入数字中较大的一个。我无法正确输出输出。例如,如果我输入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 
+0

调试。函数调用中很可能会覆盖ebx。存储在内存中,而不是一个寄存器 –

+0

@SamiKuhmonen没有寄存器被'input'影响,根据以下链接:http://flylib.com/books/en/2.265.1.27/1/ 从链接引用: 输入宏只更改指定目标处的内存。它不会更改任何寄存器内容,包括标志寄存器。 –

回答

1

问题是与指令的顺序。即使操作数1小于操作数2,唯一的区别是jg greater_than不会导致显式跳转到greater_than标签。然而,第二天指令集打印操作数1,也就是说,执行的控制将转向“内” greater_than标签。为什么?这是因为下一条指令dtoa value1, eax恰好在jg greater_than之后。那么,你现在看到了这个问题吗?你不会阻止操作数1的打印操作,如果1小于2.操作所有代码正在做的是,确保为确保您的程序打印value1如果操作数1> 2的操作数

你的代码是等效下面的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 

上面的代码确保less_than标签内的代码在操作数1>操作数2时通过显式跳转到greater_than标签而被阻止执行。当操作数1 < =操作数2时,不进行显式跳转,并执行序列中的下一条指令。在这种情况下,内部的less_than instrcutions被执行时操作数1 = <操作数2

简而言之,条件跳转导致仅当条件被满足,否则执行该序列中的下一指令的跳转。您有责任按照正确的顺序放置说明。它们不像高级条件结构,如if ... else。

更新:请注意,我的整个解决方案中只使用value1

+0

感谢您的帮助,我有一些C++的经验,所以我理解的逻辑,它似乎我绊倒在装配的实现。 –

+0

我怎么能把这个检查3个数字? –

1

如上所述,如果您在此指令之后立即使用“jg greater_than”跳转,即使EAX < = EBX您执行的应该是针对EAX> EBX条件执行的相同指令,您从不执行跳转到less_than。标签“less_than”可以被删除。你应该写:

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: 

但我有一个新的解决方案。这是一个优化的MAX(A,B)功能:

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

    CMP EAX,EBX 
CMOVL EAX,EBX 
0

输入了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 
+0

这应该是对这个问题的正确答案吗?你发布它作为答案。 –

+0

它为我工作,也许有更好的办法? –

+0

我想这可能是一个新的问题,因为你说:“这是否看起来像它的工作?”。这不是你通常如何开始答案。如果你已经测试过它并且工作,那很好。 –

相关问题