无法在汇编中将事物插入数组中

时间:2015-11-12 20:27:43

标签: arrays assembly x86

我目前正在尝试学习汇编,我给出的任务之一是获取用户输入整数并将这些数字插入数组中。一旦数组有7个整数,我将遍历数组并打印出数字。但是,我目前仍然坚持如何将数字插入数组中。这是我现在的代码:

.DATA

inputIntMessage BYTE "Enter an integer: ", 0
inputStringMessage BYTE "Enter a string: ", 0


intArray DWORD 0,0,0,0,0,0,0
intCounter DWORD 0
user_input DWORD ?

.CODE

main PROC

mov eax, intCounter
mov edx, 0

top: 
    cmp eax, 7      
    je final1
    jl L1

L1: intInput inputIntMessage, user_input
    mov ebx, user_input
    mov intArray[edx], ebx ;This is where I think the problem is.
    add edx, 4
    inc eax
    jmp top

final1:

mov ecx, 0
mov edx, 0
printarrayloop: 
            cmp edx,7
            jl L2
            je next
L2: intOutput intArray[ecx] 
    add ecx, 4
    inc edx
next:

next:只是进入下一个问题;与插入数组问题无关。我的想法是我应该使用数组的偏移量,所以我可以访问数组中每个元素的地址并直接改变它,但我不知道如何。有人能指出我正确的方向吗?

编辑:当我运行程序时,窗口会提示用户输入7次整数(按预期),然后输出用户输入的第一个数字。但是,窗口应该打印出用户输入的所有数字。

1 个答案:

答案 0 :(得分:0)

您的代码只打印一个数字的主要原因是显示数字数组的代码执行此操作:

mov ecx, 0
mov edx, 0
printarrayloop: 
    cmp edx,7
    jl L2
    je next
L2: intOutput intArray[ecx] 
    add ecx, 4
    inc edx
next:

缺少的是在显示第一个数字后不继续循环。您需要跳回 printarrayloop 来处理下一个号码。在inc edx下面添加此内容:

     jmp printarrayloop

您可能还需要考虑其他一些事项。在这段代码中:

top: 
    cmp eax, 7      
    je final1
    jl L1

L1: intInput inputIntMessage, user_input
[snip]
final1:

你做cmp eax, 7。如果它相等,你会跳出来。如果它少于那么你只是分支到标签L1。您可以通过删除无关的jl L1分支和标签来修改该代码。所以你会有这个:

top: 
    cmp eax, 7      
    je final1    
    intInput inputIntMessage, user_input

在此代码中,可以删除一些额外的说明:

mov ecx, 0
mov edx, 0
printarrayloop: 
    cmp edx,7
    jl L2
    je next
L2: intOutput intArray[ecx] 
    add ecx, 4
    inc edx
    jmp printarrayloop
next:

与之前的评论类似,我使用cmp edx,7 EDX 与7进行比较。你可以简单地说,在比较之后它是否等于7然后你跳出循环到next。如果它小于7,它将继续并打印出数字。所以你的代码看起来像这样:

mov ecx, 0
mov edx, 0
printarrayloop: 
    cmp edx,7
    je next
    intOutput intArray[ecx] 
    add ecx, 4
    inc edx
    jmp printarrayloop
next:

x86 32位代码具有缩放寻址模式(带位移)。您可以找到此摘要here中描述的所有寻址模式以及更详细的说明here

进行寻址时,可以使用比例因子(将寄存器乘以1,2,4或8)。您的代码如下所示:

    mov intArray[edx], ebx 
    add edx, 4

EDX 指向您希望显示的元素编号,将其乘以4将说明 DWORD 的大小为4个字节。因此,您可以删除add edx, 4并将访问数组的代码更改为:

    mov intArray[edx*4], ebx 

intArray[edx*4]是一个等同于intArray+(edx*4)

的地址

输出时可以进行类似的更改。删除这一行:

    add ecx, 4

使用缩放寻址:

    intOutput intArray[ecx*4]