2013-03-02 17 views
0

我對visual studio內聯彙編程序有問題,它似乎沒有加載正確的值。我聲明一個C-串像這樣:在visual studio中通過內聯彙編程序從字符串中讀取字符

const char* str = "1235"; 

然後我訪問字符串像這樣在ASM:

movzx ebx, byte ptr str[esi] 

問題是,代替裝載49到EBX(爲「1」的ASCII碼)它加載0.我相信,由於廣泛的調試,esi是正確的索引。我加載字符串錯了嗎?

+0

當您執行mov ebx,str [esi]'時,esi有什麼價值? – 2013-03-02 04:55:50

+0

@JerryCoffin esi被用作循環中的計數器,在這種情況下,它是0 – PgrAm 2013-03-02 04:57:22

+0

@PgrAm - 如果您在您的asm代碼中使用寄存器,是否不會更改周圍循環的代碼?我敢打賭它! – 2013-03-02 23:30:50

回答

4

指令

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添加到結果中,然後在那裏訪問該字節。

+0

是的,我做到了,它工作!我做了這個「mov edi,str」,然後這個「movzx ebx,byte ptr [edi + esi]」 – PgrAm 2013-03-03 23:06:58

+1

我希望你明白髮生了什麼,而不是盲目地複製答案。 – 2013-03-03 23:40:55

+0

好吧我昨天晚上自己解決了這個問題。既然你給了我正確的答案,我想我應該接受它。 – PgrAm 2013-03-04 03:38:14

0

嘗試:

movzx  ebx, byte ptr str[esi] 
+0

nope同樣的問題 – PgrAm 2013-03-02 05:14:44

+0

問題是'str'不是一個數組,所以你不能用這個尋址模式訪問它的內容。 – 2013-03-03 13:40:46

相關問題