Resb 2 эквивалентен resw 1? - PullRequest
3 голосов
/ 21 апреля 2020

В этом коде:

    global _start
section .bss
    v1 resw 1
    v2 resb 2    ;array of 2 chars 
section .text
_start:
    mov word[v1],500
    mov word[v2],500

    mov rax,60
    mov rdi,0
    syscall

Этот код правильный или нет?
Работает ли word[v1] так же, как word[v2]?

Я использую NASM на x86-64 Ubuntu.

1 Ответ

3 голосов
/ 21 апреля 2020

Да, они оба резервируют одинаковый объем памяти (2 байта), так что вы можете безопасно получить к ним доступ, используя mov word[...], ....

Обратите внимание, что это примерно равно записи uint8_t v1[2] против uint16_t v2[1] в C. Но NASM не применяет типы, поэтому каждая ссылка на память похожа на использование C memcpy() для выполнения безопасных строго псевдонимов загрузок или хранилищ, которые передают N байтов, не заботясь о типе памяти C.

Я настоятельно рекомендую использовать resw, если вы планируете использовать выделенные данные как word или массив word s, чтобы избежать путаницы и потенциальных ошибок.

...