gpt4 book ai didi

c - nasm:当输入为 NULL 时跳转

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:20 27 4
gpt4 key购买 nike

我正在使用 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:
...

关于c - nasm:当输入为 NULL 时跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com