win32彙編MessageBox顯示中文亂碼

2021-10-17 03:03:36 字數 3550 閱讀 9498

因為我對字元編碼的問題完全是乙個小白,所以在學習彙編的過程**現了下面的這種錯誤,特意記錄和學習一下。

在使用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...