Вот пример кода, который я написал с использованием синтаксиса 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' в качестве третьего параметра для системного вызова write, я получаю несколько странные дополнительные символы, напечатанные после того, как сообщение напечатано на экране:
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$
Может кто-нибудь объяснить причину этого? Спасибо.