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