Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 跳转后如何返回主控台?_Assembly_X86_Nasm - Fatal编程技术网

Assembly 跳转后如何返回主控台?

Assembly 跳转后如何返回主控台?,assembly,x86,nasm,Assembly,X86,Nasm,嗯,我有这个代码: 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 m

嗯,我有这个代码:

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

谢谢你的帮助,我的英语很抱歉。

这样试试:

第二节数据

message: db "Value = %d", 10, 0

message2: db "End", 10, 0
第2节bss

第节.案文

外部打印 全球主要

主要内容:

循环:

push ebx
push message
call printf 
inc ebx 
cmp ebx, 100000
jne loop 

ret

可能排名不够,无法添加评论

在jmp之前推送返回地址

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

这应该起作用:

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

如何返回到
main
中的操作系统?顺便说一句,调用后应该清除堆栈中的传出参数。@gsg类似的东西?是的,但在循环中。我试过了,但它返回SEGFULT,你可以在pastebin中发布代码吗?谢谢回答,但这种方式返回SEGFULT。对不起,在循环中,它应该是push ebx,然后push message,然后call。嗯,我看你在pastebin中的代码是正确的,所以我不知道……对不起!谢谢你的回答,但你能给我举个例子吗?
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