我在使用 Visual Studio 内联汇编程序时遇到问题,它似乎没有加载正确的值。我像这样声明一个 C 字符串:
const char* str = "1235";
然后我在 asm 中像这样访问字符串:
movzx ebx, byte ptr str[esi]
问题是,不是将 49 加载到 ebx('1' 的 ascii 代码)中,而是加载 0。由于大量调试,我确信 esi 是正确的索引。我加载字符串错误吗?
我在使用 Visual Studio 内联汇编程序时遇到问题,它似乎没有加载正确的值。我像这样声明一个 C 字符串:
const char* str = "1235";
然后我在 asm 中像这样访问字符串:
movzx ebx, byte ptr str[esi]
问题是,不是将 49 加载到 ebx('1' 的 ascii 代码)中,而是加载 0。由于大量调试,我确信 esi 是正确的索引。我加载字符串错误吗?
该指令
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 |
+----+
您正在尝试读取 byte str+esi
,它读取变量的一部分str
。如果esi
大于 3,则您正在阅读超过str
.
你真正想做的是阅读str
指向的东西。这意味着您需要加载str
到寄存器中(我选择了ebx
),然后添加esi
到结果中,然后访问那里的字节。
尝试:
movzx ebx, byte ptr str[esi]