nasm x86 string_length процедура проверяет нулевой байт и работает, но строка не заканчивается явно нулевым байтом - PullRequest
0 голосов
/ 14 июня 2019

Этот код работает.Я просто не понимаю, почему это всегда должно работать.

Вот строка, которая заканчивается символом перевода строки, то есть целое число 10.

section .data
message: db 'aye sup dawg!', 10

Вот как я печатаю такойстрока.Проблема с длиной строки.Я ищу 0, но в моей строке нет 0.Очевидно, следующий байт после 10 - это 0, но это не является явным в коде, и я запутался, если у меня есть правильное понимание.

string_length:
    xor rax, rax        
 .loop:
    inc rax
    cmp byte [rdi+rax], 0
    jnz .loop
    ret

print_string:
    call string_length
    mov rdx, rax        ; length arg moved for syscall      
    mov rsi, rdi        ; string ptr moved for syscall
    mov rax, 1      ; 'write' syscall numb
    mov rdi, 1      ; stdout descriptor
    syscall
    ret

Это мой собственный код для книжного упражнения.Ответ в github автора использует то же сравнение с 0, однако.Должно быть, я допустил ошибку, исходящую из C, где внутреннее строковое представление оканчивается нулем и считается длиной байта самой строки.

По сути, как я могу быть уверен, что следующеебайт после 10 равен 0?

...