nasm:输入为NULL时跳转
nasm: jump when input is NULL
我正在使用 nasm(64 位)对 put 进行重新编码,当 put 接收到 NULL 作为参数时,它会打印 (null)。我正在尝试重新创建该行为,但我无法让代码跳转到它打印的部分(空)。相反,它什么都不打印
这是我的代码:
global _my_puts
section .text
%define WRITE 0x2000004
%define STDOUT 1
_my_puts:
cmp rdi, 0
je is_null
mov r8, rdi
cmp byte [r8], 0
jne print_and_add
print_and_add:
mov rax, WRITE
mov rdi, STDOUT
mov rsi, r8
mov rdx, 1
syscall
inc r8
cmp byte [r8], 0
jne print_and_add
mov rax, WRITE
mov rdi, STDOUT
mov rdx, newline.len
lea rsi, [rel newline]
syscall
mov rax, 1
ret
is_null:
mov rax, WRITE
mov rdi, STDOUT
lea rsi, [rel nullmsg]
mov rdx, nullmsg.len
syscall
mov rax, 1
ret
section .data
nullmsg: db "(null)", 10
.len: equ $ - nullmsg
newline: db 10
.len: equ $ - newline
我也试过了
test rdi, rdi
je is_null
没有变化。有什么想法吗?
感谢您的帮助:)
你的第一个指令是问题:cmp rdi, 0
。您正在将传递给 my_puts
的字符串指针与值 0 进行比较,以确定是否应打印“(null)”而不是将字符串的第一个字节与 0 进行比较。我假设您是否通过一个 0 指针,那将是一个错误。
尝试:
_my_puts:
mov r8, rdi
cmp [r8], 0
je is_null
print_and_add:
...
如果你想针对 0 指针进行防御性检查,你也可以包括它,但你不会检查任何其他坏指针:
_my_puts:
cmp rdi, 0
je bad_pointer
mov r8, rdi
cmp [r8], 0
je is_null
print_and_add:
...
我正在使用 nasm(64 位)对 put 进行重新编码,当 put 接收到 NULL 作为参数时,它会打印 (null)。我正在尝试重新创建该行为,但我无法让代码跳转到它打印的部分(空)。相反,它什么都不打印
这是我的代码:
global _my_puts
section .text
%define WRITE 0x2000004
%define STDOUT 1
_my_puts:
cmp rdi, 0
je is_null
mov r8, rdi
cmp byte [r8], 0
jne print_and_add
print_and_add:
mov rax, WRITE
mov rdi, STDOUT
mov rsi, r8
mov rdx, 1
syscall
inc r8
cmp byte [r8], 0
jne print_and_add
mov rax, WRITE
mov rdi, STDOUT
mov rdx, newline.len
lea rsi, [rel newline]
syscall
mov rax, 1
ret
is_null:
mov rax, WRITE
mov rdi, STDOUT
lea rsi, [rel nullmsg]
mov rdx, nullmsg.len
syscall
mov rax, 1
ret
section .data
nullmsg: db "(null)", 10
.len: equ $ - nullmsg
newline: db 10
.len: equ $ - newline
我也试过了
test rdi, rdi
je is_null
没有变化。有什么想法吗?
感谢您的帮助:)
你的第一个指令是问题:cmp rdi, 0
。您正在将传递给 my_puts
的字符串指针与值 0 进行比较,以确定是否应打印“(null)”而不是将字符串的第一个字节与 0 进行比较。我假设您是否通过一个 0 指针,那将是一个错误。
尝试:
_my_puts:
mov r8, rdi
cmp [r8], 0
je is_null
print_and_add:
...
如果你想针对 0 指针进行防御性检查,你也可以包括它,但你不会检查任何其他坏指针:
_my_puts:
cmp rdi, 0
je bad_pointer
mov r8, rdi
cmp [r8], 0
je is_null
print_and_add:
...