Assembly MASM数组置换将只接受一位数

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.

我正在创建一个汇编程序,该程序将使用用户输入的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.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的映射到汇编的代码行。这并不总是成立的,但它可以帮助翻译代码。