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:
    ...