Проблемы сборки с расширенными символами ascii

введите здесь описание изображения

я хочу знать, что делать, чтобы решить эту проблему с расширенными символами ascii, я не понимаю, почему вместо буквы, представляющей 0x90, печатаются странные символы, я поставил PutStr c381, ничего не происходит введите здесь описание изображения


person Community    schedule 04.09.2018    source источник
comment
* Терминалы NIX не поддерживают расширенную кодировку VGA, подобную DOS, или любую другую, которую вы ожидаете. Если ваша современная ОС установлена ​​обычным способом, весьма вероятно, что по умолчанию она установлена ​​в кодировке UTF8 (также в TTY), а также NASM поддерживает UTF8 для источника, поэтому вы можете просто нормально писать буквы в строку, например db 'ščije'. (если вы проверите полученный машинный код - например, используйте опцию listing-file с nasm nasm -l <listing_file.lst> - UTF8 - это многобайтовая кодировка с переменным размером байта для каждого символа, поэтому некоторые символы будут собраны как несколько байтов).   -  person Ped7g    schedule 05.09.2018
comment
(если это не удается, убедитесь, что у вас везде есть кодировка UTF8, или выясните, какая другая кодировка используется... IIRC NASM предназначен только для UTF8, поэтому строки, закодированные другим способом, не могут быть записаны непосредственно как текст в исходном коде, но вы должны поместить их в исходный код в виде числовых значений для db или подобных... тогда вызов API PutStr должен поддерживать целевую кодировку, а сам терминал должен поддерживать целевую кодировку, а шрифт вашего терминала должен содержать запрошенные символы.. если все подходит, вы должен увидеть правильный символ)   -  person Ped7g    schedule 05.09.2018
comment
Это не проблема сборки; любая программа, которая делает write() системный вызов для записи 0x90 байта в стандартный вывод, сделает то же самое. (Используйте strace ./program, чтобы посмотреть, что он делает, или передайте его в hexdump -C). Например, в bash запустите printf '\x90\n', чтобы сделать то же самое. 90 0a не является допустимой многобайтовой последовательностью UTF-8, поэтому ваш терминал печатает глиф (? в ромбе).   -  person Peter Cordes    schedule 05.09.2018
comment
Я пробовал несколько раз, используя ascii-код 160 для Á, UTF8 hex c3 81 на putstr, но, честно говоря, я довольно новичок в языке ассемблера, поэтому, чтобы понять, что именно мне нужно сделать, не могли бы вы предоставить мне небольшой пример (также я использую Ubuntu 16.4, 64 бита)   -  person    schedule 05.09.2018
comment
@TonyUM Á не имеет кода ASCII. Если ваш терминал настроен на использование UTF-8, печать символов c3 81 должна работать. Если это не так, покажите нам свой код, чтобы мы могли сказать вам, в чем проблема.   -  person fuz    schedule 05.09.2018
comment
@TonyUM: это не имеет ничего общего с языком ассемблера и имеет отношение к UTF-8 (которую ожидает ваш терминал) по сравнению с ISO-8859-1 (latin-1) или Windows 1252 (IDK, который) расширенный 8-битный символ набор, из которого вы, кажется, ищете коды. Это было бы то же самое, если бы вы написали программу на C с этими байтами в char array[] и использовали stdio puts. Кроме того, я понимаю, что вам нужно показать скриншоты, чтобы проиллюстрировать, какой глиф напечатал ваш терминал, но скриншоты всего вашего рабочего стола бесполезны. Поместите код в форматирование кода. См. idownvotedbecau.se/imagesofcode.   -  person Peter Cordes    schedule 05.09.2018
comment
Вы можете настроить свой терминал на ISO-8859-1 (щелкните правой кнопкой мыши и используйте раскрывающийся список или найдите пункт меню). Вы, вероятно, захотите установить LANG=en_US только в этом терминале (не en_US.UTF-8), если вы это сделаете, чтобы другие программы продолжали работать хорошо.   -  person Peter Cordes    schedule 05.09.2018
comment
Спасибо, @PeterCordes, эта ссылка idownvotedbecau.se/imagesofcode очень полезна, чтобы лучше задавать вопросы в будущем, но я не знаю, как вставить код, потому что каждый раз, когда я пытаюсь, формат текста меняется и вставляется в беспорядке.   -  person    schedule 05.09.2018
comment
Во встроенном текстовом редакторе SO есть кнопки для применения уценки. Выберите свой код и нажмите кнопку форматирования кода {} или нажмите Ctrl-k, чтобы сделать отступ на 4 столбца. idownvotedbecau.se/imagesofcode даже содержит ссылку на stackoverflow.com/help/formatting, который объясняет это.   -  person Peter Cordes    schedule 05.09.2018


Ответы (1)


Это не имеет ничего общего с языком ассемблера и все, что связано с UTF-8 (которую ожидает ваш терминал) по сравнению с ISO-8859-1 (latin-1) или Windows 1252 (IDK который) расширенный 8-битный набор символов, который вы кажется, ищет коды из. Это было бы то же самое, если бы вы написали программу на C с этими байтами в char array[] и использовали stdio puts.

Как говорит @Fuz, «Á не имеет кода ASCII». ASCII включает только символы от 0 до 127 (младшие 32 не печатаются) http://www.asciitable.com/. Extended-ASCII 8-битные наборы символов перекрываются с UTF-8 только для кодовых точек от 0 до 127.

Любая программа, которая выполняет системный вызов write() для записи 0x90 байта в стандартный вывод, будет делать то же самое, независимо от того, на каком языке она была написана. Например, в bash запустите printf '\x90\n', чтобы сделать то же самое. 90 0a не является допустимой многобайтовой последовательностью UTF-8, поэтому ваш терминал печатает символ � (знак ? в ромбе).


Вы можете настроить свой терминал gnome на ISO-8859-1 или Windows 1252 (щелкните правой кнопкой мыши и используйте раскрывающийся список или найдите пункт меню). Я использую konsole, и он поддерживает обе эти кодировки символов, отличные от UTF-8.

Вы, вероятно, захотите установить export LANG=en_US только в этом терминале (не обычное en_US.UTF-8), если вы это сделаете, чтобы другие программы продолжали работать хорошо.

Или en_CA, или любую другую локаль, которую вы на самом деле используете, просто используйте ее версию, отличную от UTF-8, чтобы работало рисование линий man, а также полноэкранные текстовые вещи, такие как режим TUI layout reg gdb, или редакторы, такие как jed.

person Peter Cordes    schedule 05.09.2018
comment
Наконец-то я понял, спасибо, я меняю профиль терминала на ISO-8859-1 и использую код вроде 0xC2. - person ; 05.09.2018