在立即窗口中执行汇编语言指令是否可行?

3
我用C++写了一个小程序,将反汇编窗口和C++程序窗口并排放置。 我想在立即窗口执行汇编指令时查看在汇编级别上发生的情况。但是,我无法这样做。 例如,当我在立即窗口中键入“add eax, 1”时,我会得到“标识符“add”未定义”的结果。
有没有一种方法可以执行汇编指令,以便我能够像调试时那样执行“add eax, 1”之类的操作?我想这样做是为了更好地了解在汇编级别上发生的情况。 非常感谢任何帮助。
我在网上进行了很多研究,但找不到解决方案。
C++代码:
#include<iostream>
using namespace std;

int AddMe(int a, int b)
{
    int c;
    c = a + b;
    return c;
}

int main() 
{
    AddMe(10, 20);
    return 0;
}

等价汇编代码片段:

int main() 
{
00BCDC40  push        ebp  
00BCDC41  mov         ebp,esp  
00BCDC43  sub         esp,0C0h  
00BCDC49  push        ebx  
00BCDC4A  push        esi  
00BCDC4B  push        edi  
00BCDC4C  lea         edi,[ebp-0C0h]  
00BCDC52  mov         ecx,30h

汇编观察窗口:

+       (int*)(ebp) 0x001ef898 {2029812}    int *
+       (int*)(esp) 0x001ef878 {2029720}    int *
+       (int*)(esi) 0x00bc1712 {TryCatch2.exe!_mainCRTStartup} {9030121}    int *
+       (int*)(edi) 0x00bc1712 {TryCatch2.exe!_mainCRTStartup} {9030121}    int *
+       (int*)ecx   0x00000001 {???}    int *
+       (int*)(ecx) 0x00000001 {???}    int *
+       (int*)(eax) 0x00615180 {6377864}    int *
+       (int*)(edx) 0x00614fe8 {6377728}    int *
+       (int*)(esi) 0x00bc1712 {TryCatch2.exe!_mainCRTStartup} {9030121}    int *
+       (int*)(ebx) 0x002e7000 {67174400}   int *

实际结果: 当我在立即窗口中键入“add eax, 1”时,它会给出结果“标识符“add”未定义”。
期望结果: 当我在立即窗口中键入“add eax, 1”时,它应该将 1 添加到 eax 寄存器。

指令从内存中的某个位置执行。许多指令的结果取决于它们执行的位置。此外,指令指针通常在执行指令时发生变化,但如果强制执行一条指令,它会去哪里? - Thomas Jager
6
如果你查看“寄存器”调试窗口,你可以更改它们的值。 - 1201ProgramAlarm
2
假设它类似于Visual Studio,请尝试调试->窗口->反汇编以打开调试程序集窗口。 - rcgldr
在一些汇编语言中,你可以修改内存,就像在旧的DOS环境中的Turbo Debugger中一样,你实际上可以写入add ax,1,然后它将被汇编并写入到你指定的内存中,然后你可以使用调试器来执行它。但这不像在评估/立即窗口中评估指令,你实际上是在某个内存/上下文中执行它。随着现代操作系统的发展,这变得更加复杂,因为内存的可执行区域通常是只读的(除非调试器重新配置它以进行修改,然后再改回来),这取决于你使用的工具。 - Ped7g
再说,只需在汇编源码中编写一些测试汇编代码,然后在调试器中进行编译和调试就很容易了。只要汇编文件很小,它应该可以在十分之一秒内汇编和执行,在良好设置的断点和环境下,它应该与您在"即时"窗口中所想象的非常接近,只是方法不同。(但是说实话,您应该能够从参考指南中的正式描述中理解指令...我并不是说这很容易,我完全理解您想要在调试器中看到它的操作,我只是说您应该理解指令)。 - Ped7g
显示剩余2条评论
1个回答

1

在即时窗口无法更改寄存器的值。但是,在寄存器窗口和监视窗口中,我们可以更改寄存器的值(只需编辑寄存器的值)。


嗨,Vikram,感谢您的分享,请将其标记为自我回答,这将有助于其他社区成员更轻松地搜索到这些有用的信息,这只是一个提醒 :) - LoLance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接