在GAS中进行系统调用,并在.data节中使用变量,并在另一个子例程中访问它们以进行系统调用

问题描述 投票:0回答:1

这里是我使用GAS语法编写的用于64位intel汇编的代码示例。运行代码时,期望打印出字符串:在_print子例程中。

#This example is a an example to call a subroutine 
.global _start

.section .text

_start:

    call _print

_exit:   
    #exit call
    mov $60, %rax
    xor %rdi, %rdi

    syscall

_print:
    #set up the stack frame
    push %rbp
    mov %rsp, %rbp

    # write syscall's parameter set up
    mov std_out_fd, %rdi
    mov $message, %rsi
    movq message_size, %rdx
    mov write_syscall_no, %rax

    syscall

    #Restore callers registers value
    #pop %rdx
    #pop %rsi
    #pop %rdi 

    #Destroy the stack frame:
    mov %rbp, %rsp
    pop %rbp

    ret


.section .data


std_out_fd: .int 0x02

message: .ascii "Inside the _print subroutine.\n"

message_size: .byte 30

write_syscall_no: .int 0x01

=========================================>

[当我尝试使用声明的变量'message_size'作为写入系统调用的第三个参数时,在屏幕上显示消息后,我得到了一些奇怪的额外字符:

ali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$ as -o subroutine.o subroutine.s
ali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$ ld -o subroutine subroutine.o
ali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$ ./subroutine
Inside the _print subroutine.
`;`Qali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$

但是当不使用变量时,我将其更改为mov $ 30,%rdx

然后它可以正常工作,并且没有多余的字符(; Q)将不再写入标准输出。

ali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$ ./subroutine
Inside the _print subroutine.
ali@alix2:~/Programming/asm/GAS-Syntax/SubRoutine$ 

有人能解释这背后的原因吗?谢谢。

这里是我使用GAS语法编写的用于64位intel汇编的代码示例。运行代码时,期望的是打印出字符串:在_print子例程中。 #This ...

linux assembly x86-64 gas att
1个回答
0
投票

movq message_size, %rdx是64位(qword)负载,其中包括.byte 30.int 0x1,以及之后的3个字节。使用调试器(例如GDB)查看寄存器中的值。并使用strace ./subroutine跟踪系统调用并显示您传递的长度很大。

© www.soinside.com 2019 - 2024. All rights reserved.