Assembly MASM数组置换将只接受一位数
我正在创建一个汇编程序,该程序将使用用户输入的10个元素,并使用排列将它们排序为8、3、5、9、2、6、0、4、1、7。该程序正在运行,但我的问题是,它将无法与两位数的数字。如果我输入1,2,3,4,5,6,7,8,9,0。。它会给我正确的输出。但是如果我输入12,9,54,20,3,38,72,17,91,25。。它不会给我期望的91、20、38、25、54、72、12、3、9、17的输出。。它只会给我一点输出都没有。这是什么原因造成的 这是我的密码Assembly MASM数组置换将只接受一位数,assembly,masm,irvine32,Assembly,Masm,Irvine32,我正在创建一个汇编程序,该程序将使用用户输入的10个元素,并使用排列将它们排序为8、3、5、9、2、6、0、4、1、7。该程序正在运行,但我的问题是,它将无法与两位数的数字。如果我输入1,2,3,4,5,6,7,8,9,0。。它会给我正确的输出。但是如果我输入12,9,54,20,3,38,72,17,91,25。。它不会给我期望的91、20、38、25、54、72、12、3、9、17的输出。。它只会给我一点输出都没有。这是什么原因造成的 这是我的密码 INCLUDE Irvine32.
INCLUDE Irvine32.inc
.data
welcome BYTE "Welcome! This program permutates an array of size 10.", 0Ah, 0Dh, 0
message1 BYTE "Please enter the 10 elements of your array:", 0Ah, 0Dh, 0
message2 BYTE "The permutated array is: ", 0Ah, 0Dh, 0
permutation DWORD 8, 3, 5, 9, 2, 6, 0, 4, 1, 7
array DWORD 10 DUP(?)
.code
main PROC
MOV EDX, OFFSET welcome
call WriteString
MOV EDX, OFFSET message1
call WriteString
MOV ESI, OFFSET array
MOV ECX, 10
L1:
call ReadInt
MOV [ESI], EAX
ADD ESI, TYPE array
LOOP L1
MOV EDI, OFFSET permutation
MOV ESI, OFFSET array
MOV ECX, 10
L2:
MOV EAX, [EDI]
PUSH ECX
MOV ECX, 10
L3:
CMP EAX, [ESI]
JE output
ADD ESI, TYPE array
LOOP L3
back:
ADD EDI, TYPE permutation
POP ECX
LOOP L2
JMP quit
output:
MOV EAX, [ESI]
call WriteInt
MOV ESI, OFFSET array
JMP back
quit:
exit
main ENDP
END main
你不会对任何东西进行排序,你所做的可以被描述为
for(inti=0;i<10;i++){if(find(permutation[i],array)){print(array[i]);}}
,所以你只打印那些同时存在于array
和permutation
中的值。好吧,我不完全理解。我的程序对数字进行了正确排序,但不会对两位数的数字进行排序?为什么会这样?谢谢。因为我在之前的评论中解释的原因。在理解算法之前,您可能应该先用另一种语言(如Java或C)实现它,因为您在汇编代码中实现的算法是不正确的。一旦你有了一个工作程序,你就可以开始将它转录到汇编中。如果你用C/C++编写你的算法,并且在linux/unix/mac系统上,那么你可以添加-S编译标志,它将输出汇编。这有时会有所帮助。但是,就像@米迦勒所说,用C/C++语言实现另一种语言,奇怪的是,C和C++在很多情况下都有接近1到1的映射到汇编的代码行。这并不总是成立的,但它可以帮助翻译代码。