因為我對字元編碼的問題完全是乙個小白,所以在學習彙編的過程**現了下面的這種錯誤,特意記錄和學習一下。
在使用windows api函式messagebox時,出現了中文亂碼現象:
原始碼如下所示:
;**
****
****
****
****
****
****
****
****
****
****
****
****
****
*;我的第乙個32位匯程式設計序;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**;helloworld.
asm;**
****
****
****
****
****
****
****
****
****
****
****
****
****
*;使用nmake或下列命令進行編譯和鏈結
;ml /c /coff helloworld.
asm;link /subsystem:windows helloworld.obj;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**;模式定義,初始化引數
.386
;使用80386處理器指令集
.model flat,stdcall ;用來定義程式工作的模式,flat:記憶體模式,stdcall:語言模式
option casemap:none ;是否對變數與子程式名大小寫敏感,必須要進行設定 ;
****
****
****
****
****
****
****
****
****
****
****
****
****
***;include標頭檔案;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**;資料段;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**.data
szcaption db '標題',0
sztext db '你好,世界!',0
;***
****
****
****
****
****
****
****
****
****
****
****
****
****
;**段;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**.code
start:
invoke messagebox,
null
,offset sztext,\
offset szcaption,mb_ok
invoke exitprocess,
null;*
****
****
****
****
****
****
****
****
****
****
****
****
****
**end start
首先要特別注意的是:ansi(american national standards institute,美國國家標準學會)編碼並不是ascii碼,之前一直沒注意啊,所以今天就出現問題了。因為我之前一直都是用utf-8編碼來編寫文件的,而windows在早期的發展過程中一直使用的都是ansi編碼,這套編碼好像不同的地區都有著一套不同的標準,我們國家的標準是gb2312(後面擴充套件為gbk字符集),不像現在的unicode編碼,所以說ansi編碼更像是乙個字元編碼的集合。既然知道了這其中的緣由,那麼就修改起來就變得比較容易了,只需要進行下面的操作就行了。由於ansi編碼與utf-8編碼(英文本元佔乙個位元組,中文字元佔多個位元組)並不相同, 所以就會導致許多ansi編碼的軟體庫不能使用,而微軟為了不損失掉這龐大的軟體庫,所以它就搞出來了乙個bom標籤,也就是通過這個bom標籤來區分ansi編碼與unicode編碼,這樣就可以兩者兼得。
之後再重新編譯鏈結程式,執行結果如下:
所以不得不吐槽一下windows,有的時候程式出現問題它總給你這種感覺:別問,問就是歷史遺留問題*^*。
參考資料:
Win32彙編基礎
常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...
Win32彙編 實數
386 選擇的處理器 model flat,stdcall option casemap none 指明識別符號大小寫敏感 include kernel32.inc 要引用的標頭檔案 includelib kernel32.lib 要引用的庫檔案 includelib msvcrt.lib 引用c庫...
開始學習win32彙編
前段時間對於csdn的部落格系統徹底失望,在我現在寫的東西都還不知道能不能正常發出去,鬱悶,加上過年有這麼久沒有來了。這段時間開始學習彙編,說到彙編,大學開過兩門相關課程,微機原理和微控制器都是學這方面的,不過那都是8086,51級別的彙編,感覺根本跟不上時代,那時候學的還不錯 現在想學習學習win...