如果我必须将short int v[5] = {1,2,3,4,5}
翻译成assembly
代码,我该怎么办?如果我做这样的事情就可以了:
Enter 16,0
Mov ebp-4, 1
Mov ebp-8, 2
Mov ebp-12, 3
Mov ebp-16, 4
感谢。
答案 0 :(得分:2)
你可以这样做,但正如@ Ped7g指出的那样,你需要限定符。 v [0]将在内存中降低20个字节,因此您必须以相反的顺序编写它们。
enter 20, 0
; At this point ESP is the pointer to v[]
mov dword [bp-20], 1
mov dword [bp-16], 2
mov dword [bp-12], 3
mov dword [bp-8], 4
mov dword [bp-4], 5
你必须使用dword的原因是因为想象堆栈的竞争如下;
2F 3D 17 0A 41 FF 16 18 03 22 19 0D 01 F3 D1 0C 12 02 EE 4A
对字节 [bp-4]使用字节限定符,5 只会改变2F。然而,DWORD会更改所有4个字节,然后变为
05 00 00 00
要节省程序空间,您还可以
push bp
mov bp, sp
push 5
push 4
push 3
push 2
push 1
有一些警告,但由于IA32是结构化的,它们将扩展到32位。虽然使用了很少的代码。
在程序之外声明,然后它将成为
v: dw 1, 2, 3, 4, 5