通过visual studio中的内联汇编程序从字符串中读取字符

时间:2013-03-02 04:54:44

标签: visual-studio assembly x86

我遇到了visual studio内联汇编程序的问题,它似乎没有加载正确的值。我声明一个像这样的C字符串:

const char* str = "1235";  

然后我在asm中访问字符串:

movzx ebx, byte ptr str[esi]

问题是,不是将49加载到ebx(ascii代码为'1'),而是加载0.我确信esi是正确的索引,因为广泛的调试。我加载字符串错了吗?

2 个答案:

答案 0 :(得分:4)

指令

movzx ebx, byte ptr str[esi]

表示在esi开始后读取str字节的字节。它是

的汇编语言
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添加到结果中,然后访问那里的字节。

答案 1 :(得分:0)

尝试:

movzx     ebx, byte ptr str[esi]