assembly 为什么pop不能在函数调用中工作?(NASM)[副本]

iovurdzv  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(157)

此问题已在此处有答案

x86 assembly: Pass parameter to a function through stack(3个答案)
Setting segment registers after ORG instruction(1个答案)
Boot loader doesn't jump to kernel code(1个答案)
4天前关闭。
我试图通过将参数推送到堆栈上,然后将它们弹出到函数内部的寄存器中来将参数传递给函数调用,如下所示:

push keystring+0x7c00
    call PrintString
    jmp $

;====functions====

PrintString:
    pop ecx
    mov ah, 0x0e
LoopHead:
    mov bl, 0
    mov al, [ecx]
    int 0x10
    inc ecx
    add bl, [ecx]
    jnz LoopHead
    ret

;====variables====

keystring:
    db "Press any key...", 0

;====padding====

    times 510-($-$$) db 0
    db 0x55, 0xAA

如果我把参数存储在ecx中,并在函数中使用ecx,它就能正常工作,但由于某些原因,pop就不能工作。有人知道我该怎么解决吗?

z8dt9xmd

z8dt9xmd1#

我想明白了,伙计们,我不得不把它放进cx两次。如果没有你们的建议,我是无法弄清楚的,比如尝试16位地址,并且知道返回地址会自动推送到堆栈。如果有人感兴趣的话,下面是固定代码:

org 0x7c00
    push keystring
    call PrintString
    jmp $

;====functions====

PrintString:
    pop di
    shl edi, 16
    pop di
    push eax
    push ebx
    push ecx
    xor ecx, ecx
    mov cx, di
    mov ah, 0x0e
LoopHead:
    mov al, [ecx]
    int 0x10
    inc ecx
    mov bl, [ecx]
    add bl, 0
    jnz LoopHead
    pop ecx
    pop ebx
    pop eax
    shr edi, 16
    push di
    ret

;====variables====

keystring:
    db "Press any key...", 0

;====padding====

    times 510-($-$$) db 0
    db 0x55, 0xAA

相关问题