Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 指向数组的ASM语言指针_Assembly_X86 - Fatal编程技术网

Assembly 指向数组的ASM语言指针

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

我的项目我应该创建一个程序,用x个斐波那契数填充一个数组。在这种情况下是47。我已经有了程序集来获取数字等等,我似乎无法将它们放入我的数组中。任何帮助都会很好,因为我确信我刚刚开始学习语法。我正在visual studio中调试它,所以我猜这是masm?提前谢谢

.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个元素的人)。但我最终写了足够多的评论来回答问题,而我本应该发布一个答案的。更正了,所以您可以将其标记为已接受。