来自输入的装配最大值
简单的装配程序可以吐出两个用户输入数字中较大的一个。我无法正确输出输出。例如,如果我输入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 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
。
感谢您的帮助,我有一些C++的经验,所以我理解的逻辑,它似乎我绊倒在装配的实现。 –
我怎么能把这个检查3个数字? –
如上所述,如果您在此指令之后立即使用“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
输入了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。存储在内存中,而不是一个寄存器 –
@SamiKuhmonen没有寄存器被'input'影响,根据以下链接:http://flylib.com/books/en/2.265.1.27/1/ 从链接引用: 输入宏只更改指定目标处的内存。它不会更改任何寄存器内容,包括标志寄存器。 –