Assembly 指向数组的ASM语言指针
我的项目我应该创建一个程序,用x个斐波那契数填充一个数组。在这种情况下是47。我已经有了程序集来获取数字等等,我似乎无法将它们放入我的数组中。任何帮助都会很好,因为我确信我刚刚开始学习语法。我正在visual studio中调试它,所以我猜这是masm?提前谢谢Assembly 指向数组的ASM语言指针,assembly,x86,Assembly,X86,我的项目我应该创建一个程序,用x个斐波那契数填充一个数组。在这种情况下是47。我已经有了程序集来获取数字等等,我似乎无法将它们放入我的数组中。任何帮助都会很好,因为我确信我刚刚开始学习语法。我正在visual studio中调试它,所以我猜这是masm?提前谢谢 .386 .model flat,stdcall .stack 4096 ExitProcess proto,dwExitCode:dword .data fibba DWORD 47 DUP(?) .code main proc
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
fibba DWORD 47 DUP(?)
.code
main proc
mov eax,1 ;current number
mov ebx,0 ;last number in array
mov edi,0 ;array location
mov ecx,LENGTHOF fibba ;how many loops
L1:
mov [fibba+edi] ,eax ;move current into array
push eax ;move current into stack
add eax, ebx ;adding previous to current
pop ebx ;pulling last number used off stack
inc edi ;incrementing array location
loop L1
invoke ExitProcess,0
main endp
end main
使用
[fibba+edi*4]
或将edi
增加4(dword的宽度)。您目前正在进行4B存储,重叠3B
相关报道:我的回答是
使用push-eax/pop-ebx是解决这个问题的一种新方法。这不是最有效的,但它应该有效。好主意。此外,也可以使用dec ecx/jnz
(或不同的循环条件,如cmp edi、fibba+47*4
)
(在评论中)
从技术上讲,我是将fibba定义为一个词还是一个双字?我应该用双字。但是在这一点上,push/pop将不起作用,因为push/pop限制为4字节。。是吗
您保留了47*4个字节,其中fibba
标签标记了它的开始。DWORD是32位(4字节)。在x86 asm术语中,“字”只有16位,因为它是16位的传统
在大多数CPU上,整数的“自然”大小是一个字(例如,在MIPS、ARM等上是32位),但在x86上不是。x86上整数的“自然”大小为4字节/32位,但称为dword(双字)。不管怎么说,您不是在fibba中推/弹出,而是使用它来保存/恢复寄存器的全宽(也就是4字节)
Microsoft的汇编器有一些“魔力”,它可以查看标签后使用什么指令来暗示操作数大小,例如
mov[fibba],0
,但其他汇编器需要显式大小,因为两个操作数都不是寄存器。在我看来,这是一个更好的思考方式:内存本身没有任何类型,它只是一个字节包,这取决于你作为asm程序员如何正确使用它。这就是为什么你没有收到任何关于只偏移1字节的重叠4字节存储的警告,你只是在内存中得到了虚假数据。使用[fibba+edi*4]
或将edi
增加4(dword的宽度)。相关:。使用push-eax
/pop-ebx
是解决该问题的一种新方法。这不是最有效的,但它应该有效。好主意。另外,使用dec/jnz.OK,这是一个巨大的hep!非常感谢。最后一个问题。从技术上讲,我是将fibba定义为一个词还是一个双字?我应该用双字。但是在这一点上,push/pop将不起作用,因为push/pop限制为4字节。。是吗?你太棒了!我准备好了!现在如何将您的答案设置为解决方案!>LOLI打算留下一个简短的评论,然后可能会找到一个重复的问题来结束这个问题(你肯定不是第一个将指针增加1字节而不是1个元素的人)。但我最终写了足够多的评论来回答问题,而我本应该发布一个答案的。更正了,所以您可以将其标记为已接受。