我的项目我应该创建一个用x个fibbonacci数填充数组的程序。在这种情况下它是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
答案 0 :(得分:3)
使用[fibba+edi*4]
或将edi
增加4(双字的宽度)。您目前正在进行与3B重叠的4B商店。
相关:我对Assembly Language (x86): How to create a loop to calculate Fibonacci sequence的回答。
使用push eax / pop ebx是一种解决问题的新方法。它不是最有效的,但应该有效。干净的想法。另外,loop
instruction is slow使用dec ecx/jnz
(或不同的循环条件,如cmp edi, fibba+47*4
)。
(在评论中)
我在技术上将fibba定义为单词还是双字?我应该使用双字。但是那时推弹出不会工作,因为推/弹限制为4个字节..是吗?
您预留了47 * 4个字节,fibba
标签标记了它的开头。 DWORD是32位(4字节)。在x86 asm术语中,“字”只有16位,因为它的16位传统。
在大多数CPU上,整数的“自然”大小是一个字(例如MIPS,ARM等上的32位),但不是x86上的字。 x86上整数的“自然”大小是4字节/ 32位,但它被称为双字(双字)。无论如何,你不是在推动/弹出fibba,你用它来保存/恢复寄存器的整个宽度(也是4个字节)。
Microsoft的汇编程序有一些“魔力”,它会查看在标签之后使用哪些指令来暗示mov [fibba], 0
之类的操作数大小,但是其他汇编程序需要显式大小,因为操作数都不是寄存器。 IMO这是一个更好的思考方式:内存本身并不具有任何类型,它只是一个字节包,并且由asm程序员来决定它是否正确。这就是为什么你没有得到任何关于重叠的4字节存储偏移仅1个字节的警告,你只是在内存中得到了伪造的数据。