所以在我的大學課堂上,我們正在 Visual Studio 企業中學習匯編。最近,我接到了一項任務,將基本 ASCII 代碼中的手寫字母轉換為波蘭語字母(例如 a : ?、o : ó 等)。
我還得到了具有不同符號編碼系統的表格(這些值后面是什么字母)。于是一一嘗試后,原來編碼是latin2。
我的問題是它是否是匯編中符號的某種默認值,還是只是單位元組符號的視覺屬性?因為我想,當涉及到 emoji 時,它們的值必須存盤在更大的值中。
另一個問題是我如何知道使用的是哪種編碼系統?您是否必須嘗試一些值并檢查它們是否與某些系統中的編碼相匹配?
下面的代碼(對不起,波蘭語評論,它是從我的課上復制的):
; program przyk?adowy (wersja 32-bitowa)
.686
.model flat
extern _ExitProcess@4 : PROC
extern __write : PROC ; (dwa znaki podkre?lenia)
public _main
.data
tekst db 10, 'Nazywam sie . . . ' , 10
db 'M',0A2H, 'j pierwszy 32-bitowy program '
db 'asemblerowy dzia', 88H ,'a j',75H,0BEH,' poprawnie!', 10
.code
_main PROC
mov ecx, 85 ; liczba znaków wy?wietlanego tekstu
; wywo?anie funkcji ”write” z biblioteki j?zyka C
push ecx ; liczba znaków wy?wietlanego tekstu
push dword PTR OFFSET tekst ; po?o?enie obszaru
; ze znakami
push dword PTR 1 ; uchwyt urz?dzenia wyj?ciowego
call __write ; wy?wietlenie znaków
; (dwa znaki podkre?lenia _ )
add esp, 12 ; usuni?cie parametrów ze stosu
; zakończenie wykonywania programu
push dword PTR 0 ; kod powrotu programu
call _ExitProcess@4
_main ENDP
END
我想提一下,這個問題不是關于使這段代碼作業,因為它已經作業了,這是一個 100% 的理論問題,關于如何判斷匯編中使用了哪個符號編碼。
uj5u.com熱心網友回復:
個人計算機基于值為 0..127 的ASCII代碼,可以擴展為編碼附加值 128..255。這些值 0..255 與將顯示的字形(字體)之間的關系稱為代碼頁。256 個可顯示字符不足以涵蓋所有非歐洲字母、表情符號等,這就是建立Unicode表的原因。具有以 Unicode 定義的值的字符可以通過多種方式進行編碼。
基于 Unix 的系統使用UTF-8編碼(一個字符被編碼為 1、2、3 或 4 個位元組)。
MS Windows 使用UTF-16其功能的 WIDE 變體中的編碼(兩個或四個位元組),或者 ANSI 或 OEM 編碼(每個字符一個位元組)。這些一位元組的變體需要指定代碼頁。
你說db 'M',0A2H, 'j pierwszy 32-bitowy program '正確顯示文本,即Mój pierwszy 32-bitowy program。這證明該值0A2h映射到一個字形ó,它對應于 OEM代碼頁 852。大多數 Windows 控制臺功能使用 OEM 編碼(每個字符一個位元組),并且可以在控制臺視窗的屬性中指定代碼頁。
你怎么知道匯編中使用了哪種編碼?這取決于用于在螢屏上書寫的方法。該函式__write()顯然使用 WriteConsoleA() 或 WriteFile(),這應該與預期的編碼一起記錄在其描述中。另請參閱asm 中的字符編碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343791.html
標籤:集会
上一篇:如何使用.startswith在資料框中創建新變數?
下一篇:記憶體性能中的存盤操作如何作業?
