首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在跳伞后返回主站?

如何在跳伞后返回主站?
EN

Stack Overflow用户
提问于 2014-03-12 04:25:26
回答 3查看 2.1K关注 0票数 1

我有个密码:

代码语言:javascript
复制
SECTION .data
    message: db "Value = %d", 10, 0
    message2: db "End", 10, 0
SECTION .bss

SECTION .text

extern printf
global main

main:
    push ebp
    mov ebp, esp

    mov ebx, 0
    jmp loop
    push message2
    call printf
    mov esp, ebp
    pop ebp
    ret

loop: 
    push ebx 
    push message 
    call printf 
    inc ebx 
    cmp ebx, 100000
    jne loop 
    mov esp, ebp
    pop ebp

我想知道如何返回main,然后打印message2?

谢谢你的帮助,为我的英语道歉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-22 19:59:18

问题是,您正在调用使用cdecl调用约定的C-函数(调用方必须清理堆栈)。这意味着在调用之后,必须将参数的大小(以字节为单位)添加到堆栈指针中。第一个printf使用2个dword参数(8个字节),因此必须在调用后将8个添加到堆栈指针中。第二个调用传递一个dword,因此将4添加到堆栈指针中。

这应该是可行的:

代码语言:javascript
复制
SECTION .data
        message: db "Value = %d", 10, 0
        message2: db "End", 10, 0
SECTION .bss

SECTION .text

extern printf
global main

main:
        push ebp
        mov ebp, esp

        mov ebx, 0
        call loop
        push message2
        call printf
        add esp, 4
        mov esp, ebp
        pop ebp
        ret

loop:
        push ebx
        push message
        call printf
        add esp, 8
        inc ebx
        cmp ebx, 10000
        jne loop
        ret
票数 1
EN

Stack Overflow用户

发布于 2014-03-12 04:43:52

这样试一试:

区段.data

代码语言:javascript
复制
message: db "Value = %d", 10, 0

message2: db "End", 10, 0

区段.bss

区段.text

外印全球主

主要:

代码语言:javascript
复制
push ebp
mov ebp, esp

mov ebx, 0
call loop

push message2
call printf

mov esp, ebp
pop ebp
ret

循环:

代码语言:javascript
复制
push ebx
push message
call printf 
inc ebx 
cmp ebx, 100000
jne loop 

ret
票数 0
EN

Stack Overflow用户

发布于 2014-03-12 04:50:50

可能没有足够的排名作为评论添加..。

在jmp之前推送返回地址

参见:Substitutes for x86 assembly 'call' instruction?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22342022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档