文件描述符不打印
File descriptor not printing
我对 ASM 还很陌生。我正在调用 sys_open
并尝试打印该系统调用的 return 值(我想查看 fd 或错误)。但是,我的代码不起作用。非常感谢在正确方向上提供的任何帮助。谢谢!
生成文件
asm: test.o
ld -o asm test.o
test.o: test.asm
nasm -f elf64 -g test.asm
test.asm
SECTION .text
GLOBAL _start
_start: mov rax, 2 ; sys_open
mov rdi, file ; get file name address
mov rsi, 0 ; read only
syscall
sub al, '0' ; load fd
mov byte [buf], al ; move fd to buf
mov rsi, buf ; set address of buf
mov rdx, 64 ; set length of buf QWORD
call print
.exit: mov rax, 60 ; sys_exit
mov rdi, 0 ; exit success
syscall
; rsi address of buffer
; rdx length of buffer
print: push rax
push rdi
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
syscall
pop rdi
pop rax
ret
SECTION .data
file DB `test.asm[=11=]`
SECTION .bss
buf RESQ 1
跟踪输出
execve("./asm", ["./asm"], [/* 26 vars */]) = 0
open("test.asm", O_RDONLY) = 3
write(1, "3[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]"..., 64Ó) = 64
exit(0) = ?
+++ exited with 0 +++
调试符号需要 -g -F 选项
nasm -f elf64 -g -F 刺 test.asm
此块不正确:
sub al, '0' ; load fd
mov byte [buf], al ; move fd to buf
mov rsi, buf ; set address of buf
mov rdx, 64 ; set length of buf QWORD
call print
因为 sys_open
returns 和 int
,应该使用 eax
而不是 al
。此外,当将 int 转换为等效的 ASCII 字符时,sub
应该是 add
(在此示例中,可以假设 fd < 10)。最后,mov rdx, 64
应该是 mov rdx, 8
,移动 8 个字节,64 位。
这是修改后的块:
add eax, '0' ; load fd
mov dword [buf], eax ; move fd to buf
mov rsi, buf ; set address of buf
mov rdx, 8 ; set length of buf QWORD
call print
这会打印 sys_open
返回的 fd:
$ ./a.out
3$
我对 ASM 还很陌生。我正在调用 sys_open
并尝试打印该系统调用的 return 值(我想查看 fd 或错误)。但是,我的代码不起作用。非常感谢在正确方向上提供的任何帮助。谢谢!
生成文件
asm: test.o
ld -o asm test.o
test.o: test.asm
nasm -f elf64 -g test.asm
test.asm
SECTION .text
GLOBAL _start
_start: mov rax, 2 ; sys_open
mov rdi, file ; get file name address
mov rsi, 0 ; read only
syscall
sub al, '0' ; load fd
mov byte [buf], al ; move fd to buf
mov rsi, buf ; set address of buf
mov rdx, 64 ; set length of buf QWORD
call print
.exit: mov rax, 60 ; sys_exit
mov rdi, 0 ; exit success
syscall
; rsi address of buffer
; rdx length of buffer
print: push rax
push rdi
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
syscall
pop rdi
pop rax
ret
SECTION .data
file DB `test.asm[=11=]`
SECTION .bss
buf RESQ 1
跟踪输出
execve("./asm", ["./asm"], [/* 26 vars */]) = 0
open("test.asm", O_RDONLY) = 3
write(1, "3[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]"..., 64Ó) = 64
exit(0) = ?
+++ exited with 0 +++
调试符号需要 -g -F 选项
nasm -f elf64 -g -F 刺 test.asm
此块不正确:
sub al, '0' ; load fd mov byte [buf], al ; move fd to buf mov rsi, buf ; set address of buf mov rdx, 64 ; set length of buf QWORD call print
因为 sys_open
returns 和 int
,应该使用 eax
而不是 al
。此外,当将 int 转换为等效的 ASCII 字符时,sub
应该是 add
(在此示例中,可以假设 fd < 10)。最后,mov rdx, 64
应该是 mov rdx, 8
,移动 8 个字节,64 位。
这是修改后的块:
add eax, '0' ; load fd
mov dword [buf], eax ; move fd to buf
mov rsi, buf ; set address of buf
mov rdx, 8 ; set length of buf QWORD
call print
这会打印 sys_open
返回的 fd:
$ ./a.out
3$