В отличие от 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)