汇编语言循环问题 - 随机整数也打印

时间:2016-11-02 22:57:56

标签: assembly x86

我的循环问题,在某种程度上,它正在按预期工作;正如您在下面的图像中看到的那样,程序正在打印每个用户输入的数字,然后按用户输入的顺序输入正确的字符。但是,我也会在它们之间出现随机数字。

output

    mov esi, [items]            //Esi points to the first item - Calling data from the C code and assigning it to the esi source indexer, in this case being the users inputted number. 



    loop1: mov eax, [esi]       // moves the first number which is in esi to the eax register
           push eax             // pushes it onto the stack so it can be used 
           call printInt        // Prints the integer in the eax register



           push ','             // Prints a comma after the number inputted
           call printChar

           push ' '             // Prints a space
           call printChar

           push '*'
           call printChar

           call printNewLine

           mov eax, [esi]
           inc esi          // Now that's odd. Esi is pointing at an integer, and that's 4 bytes in size.
           cmp eax, 0

           jnz loop1



        jmp finish          // We need to jump past the subroutine(s) that follow
                                // else the CPU will just carry on going.

这里真的很感激任何帮助!提前谢谢。

1 个答案:

答案 0 :(得分:2)

您正在读取的数组只是一个连续的内存块,从某个地址开始。在您的情况下,地址是通过解除引用DEBUG_BACKTRACE_IGNORE_ARGS标签获得的32位值:

items

该数组包含四个32位宽整数。由于您的CPU具有little-endian字节排序,因此数组的内存内容可写为:

mov esi, [items] // So now we hold the address of an array

现在,当你试图打印一个特定元素时,你需要知道,汇编语言不能提供任何类型的指针算法(比如C语言) - 你需要自己处理它。

让我们来看看第一次和第二次致电01 00 00 00 02 00 00 00 03 00 00 00 00 00 00 00 时会发生什么。首先,你得到了正确的结果,因为地址指向第一个元素,即:

printInt

但是,当您将01 00 00 00 仅增加1时,第二个元素将被读为:

%esi

表示00 00 00 02 的值。

为了修复代码,您需要考虑每个元素的大小,即四个字节。例如,您可以将2 * 2*24 = 33554432指令替换为:

inc