汇编语言中的数组

时间:2018-01-24 08:59:28

标签: assembly x86 nasm

如果我必须将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

感谢。

1 个答案:

答案 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