程序集x86中的DWORD中的PUSH和POP超出

时间:2013-10-27 02:04:46

标签: loops assembly x86 masm irvine32

到目前为止,我尝试了几种方法在DWORD中打印值,但我只得到第一个或最后一个数字,我需要以相反的顺序打印所有5个数字。

INCLUDE Irvine32.inc

.data

arr1 DWORD 2, 4, 6, 8, 10

.code
main PROC
    mov ecx,4
    mov esi,0
L1:
    mov eax,arr1[esi]

    push eax 
    sub esi,4
    loop L1
    mov ecx,4   
    mov esi,0
L2:     pop eax
    mov arr1[esi],eax
    add esi,4
    loop L2
    mov esi,OFFSET arr1
    mov ecx,4
L3:
    mov eax,[esi+ecx*4]

    call WriteDec
    sub ecx,4
    call EndLine
    loop L3
    call Crlf

    exit
main ENDP
END main

1 个答案:

答案 0 :(得分:1)

好的,StackLIFO,这意味着您推入堆栈的最后一个值是弹出的第一个值,对吗?

如果你这样做:

push    2
push    4
push    6
push    8
push    10

然后从堆栈弹出的第一个值是10,然后是8,然后是6,等等。所以10将首先打印出来。

我们可以删除很多代码,因为您只想以pop的相反顺序打印值。

main PROC
    mov     ecx, 5
    mov     esi, 0
L1:
    push    arr1[esi]   
    add     esi, 4      ; add 4 to arr1 pointer
    loop    L1          ; loop until ecx == 0

    mov     ecx, 5      ; reset loop counter
L3:
    pop     eax
    call    WriteDec
    call    Crlf
    loop    L3

    call    Crlf
    call    WaitMsg
    exit
main ENDP

enter image description here