Assembly 来自输入的程序集最大值
简单的汇编程序,可以吐出两个用户输入数中较大的一个。我很难得到正确的输出。例如,如果我输入45和55,最大值将是55,但是当我尝试反向输入55和45(答案仍然应该是55)时,我得到45。该程序似乎只输出在EAX中输入和存储的第二个值。非常感谢您的帮助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
.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个数字?这应该是问题的正确答案吗?你把它作为一个答案贴了出来。我想这可能是一个新问题,因为你说“这个看起来有用吗?”。你通常不是这样开始回答的。如果你已经测试过这个,并且它可以工作,那很好。是的,我知道,我使用了错误的链接来添加评论。下次我会改正的。谢谢你的帮助。这应该是这个问题的正确答案吗?你把它作为一个答案贴了出来。我想这可能是一个新问题,因为你说“这个看起来有用吗?”。你通常不是这样开始回答的。如果你已经测试过这个,并且它可以工作,那很好。是的,我知道,我使用了错误的链接来添加评论。下次我会改正的。谢谢你的帮助。