我的循环问题,在某种程度上,它正在按预期工作;正如您在下面的图像中看到的那样,程序正在打印每个用户输入的数字,然后按用户输入的顺序输入正确的字符。但是,我也会在它们之间出现随机数字。
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.
这里真的很感激任何帮助!提前谢谢。
答案 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