Я хочу, чтобы вызвать системный вызов записи с 32-битной сборки, код им с помощью прямо сейчас:Смешанное число и строка на выходе Трассирование в записи системного вызова
.section .rodata # read-only data
msg:
.ascii "hello" # not null-terminated string called "msg"
len:
.long 5 # length of "msg"
.section .text # actual runnable code
.globl _start
.type _start, @function
_start:
movl $4, %eax # syscall number into eax (4 is write)
movl $1, %ebx # argument number 1 into ebx (stdout)
movl $msg, %ecx # argument number 2 into ecx
movl len, %edx # argument number 3 into edx
int $0x80
movl $1, %eax # syscall number into eax (1 is exit)
movl $0, %ebx # argument number 1 into ebx (exit code)
int $0x80
Он собирает и работает правильно, печатая строку " привет»на консоль, но когда я использую Трассирование, чтобы„видеть“запись происходит, я получаю следующий результат:
execve("./main", ["./main"], [/* 86 vars */]) = 0
strace: [ Process PID=22529 runs in 32 bit mode. ]
write(1, "hello", 5hello) = 5
exit(0) = ?
+++ exited with 0 +++
Я хотел бы знать, что вызывает третий arugment быть 5hello вместо 5.
Ничего, 'hello' в нем есть фактический результат вашей программы. Переадресовывайте вывод либо strace, либо вашего кода, чтобы они не перемещались. – Jester