我對visual studio內聯彙編程序有問題,它似乎沒有加載正確的值。我聲明一個C-串像這樣:在visual studio中通過內聯彙編程序從字符串中讀取字符
const char* str = "1235";
然後我訪問字符串像這樣在ASM:
movzx ebx, byte ptr str[esi]
問題是,代替裝載49到EBX(爲「1」的ASCII碼)它加載0.我相信,由於廣泛的調試,esi是正確的索引。我加載字符串錯了嗎?
我對visual studio內聯彙編程序有問題,它似乎沒有加載正確的值。我聲明一個C-串像這樣:在visual studio中通過內聯彙編程序從字符串中讀取字符
const char* str = "1235";
然後我訪問字符串像這樣在ASM:
movzx ebx, byte ptr str[esi]
問題是,代替裝載49到EBX(爲「1」的ASCII碼)它加載0.我相信,由於廣泛的調試,esi是正確的索引。我加載字符串錯了嗎?
指令
movzx ebx, byte ptr str[esi]
說閱讀是的str
開始後esi
字節一個字節。它是彙編語言等效的
ebx = *(unsigned char*)(&str) + esi);
在你的情況的,str
是一個指針變量,所以str[0]
是指針的低8位,str[1]
是8-15位,str[2]
是16-23位,和str[3]
是第24-31位。任何大於3的值都是緩衝區溢出,因爲您正在讀取的內存不是str
的一部分。
實際上想要將str
變量載入寄存器,然後從該寄存器進行索引尋址。
mov ebx, str
movzx ebx, byte ptr [ebx+esi]
在圖片:
+----+
1003 | 12 |
+----+
1002 | 34 |
+----+
1001 | 56 |
+----+
str 1000 | 78 |
+----+
+----+
1234567D | 00 |
+----+
1234567C | 45 |
+----+
1234567B | 44 |
+----+
1234567A | 43 |
+----+
12345679 | 42 |
+----+
12345678 | 41 |
+----+
您嘗試讀取字節str+esi
,它讀取變量str
的一部分。如果esi
大於3,則表示正在讀取str
的末尾。
你實際上想要做的是讀str
指向的東西。這意味着您需要將str
加載到寄存器(我選擇了ebx
),然後將esi
添加到結果中,然後在那裏訪問該字節。
嘗試:
movzx ebx, byte ptr str[esi]
nope同樣的問題 – PgrAm 2013-03-02 05:14:44
問題是'str'不是一個數組,所以你不能用這個尋址模式訪問它的內容。 – 2013-03-03 13:40:46
當您執行mov ebx,str [esi]'時,esi有什麼價值? – 2013-03-02 04:55:50
@JerryCoffin esi被用作循環中的計數器,在這種情況下,它是0 – PgrAm 2013-03-02 04:57:22
@PgrAm - 如果您在您的asm代碼中使用寄存器,是否不會更改周圍循環的代碼?我敢打賭它! – 2013-03-02 23:30:50