В отличие от NASM, GAS не поддерживает многозначные символьные литералы в качестве числовых констант.

(прочитав это русскоязычное предложение повторно, я не понимаю, что именно хотел сказать писатель)

Есть три варианта прочтения:
- в NASM есть макросы специальные для преобразования UTF-8 в UTF-16 и 32 (а в GAS, вероятно таких нет)
- в NASM можно записывать строку как константу в ассемблерной команде (а в GAS - нельзя так)
- GAS не понимает UTF-8, потому что там есть только директивы ascii и asciz, но аналогичных директив для не ASCII там нет.

Хотелось бы сказать, что GAS не понимает UTF-8, но
это расходится с результатами экспериментов:

Код:
.data
msg:
    .asciz "Здравствуй мир!\n"
 
.extern printf
.extern flush
.text
    .global main # entry point
main:
    movq %rsp, %rbp #for correct debugging
    andq $-16, %rsp
    movq $msg, %rdi
    call printf
    movq %rbp, %rsp
    xorq %rax, %rax
    ret

И оно выводит "Здравствуй мир!" на консоль русскими буквами.

https://stackoverflow.com/questions/458 … -assembler

Почему так происходит - в принципе, наверное, понятно.
Если ассемблер читает строку побайтово, он её так же записывает в результирующий файл, главное чтобы там не встретились
особые символы UTF-8 вторым байтом имеющие двойную кавычку.
" = 0x22 = 34

А в кодировке UTF-8 все последующие байты больше 127, начинаются с битов 10xxxxxx
(в то время как код двойной кавычки " меньше 128)

Поэтому ассемблер не пропустит закрывающую кавычку и правильно перепишет всю строчку из исходника в выходной файл побайтно.

Отредактировано Лис (2021-01-07 21:24:37)