这是一个简单的问题:
我尝试在32位Windows 7上使用Embarcadero C ++ Builder XE3进行内联汇编试验,特别是开始重新教授自己的汇编,以及未来实用的应用程序。
到目前为止,我已经能够在一个简单的控制台项目中编写一组指令,使用我可以使用的所有C ++ Builder语法编译好了:
int _tmain(int argc, _TCHAR* argv[]) {
_asm{
mov dl, 0x24
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x25
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x26
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x27
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
int 0x20 // terminate COM
}
return 0;
}
编译正常,这些说明直接在NASM和Windows本机DEBUG环境中工作。我期望的是对控制台的简单写入:$%&'
然后成功终止。
但是,当我尝试通过命令行运行Project1.exe
时,我立即得到一个标准的Win7运行时错误弹出窗口,它会在几秒钟后消失并终止程序。
通过调试运行,我似乎在它挂起之前成功到达了第一个int 0x21
,此时Borland给了我这样的信息:
项目Project1.exe引发异常类$ C00000005,并在0x00401213处发出消息'访问冲突:读取地址0xffffffff'。
我的理论是,我没有用256字节的偏移量正确初始化段(NASM会在指令集的开头使用org 0x100
之类的东西)。但我并不完全确定这个问题。
有什么想法吗?
答案 0 :(得分:3)
这些int 0x21
说明适用于 MS-DOS 而非Windows。它们意味着Windows程序中的其他内容,结果导致您陷入其中。
答案 1 :(得分:0)
我主要在C ++ Builder中工作,但我也编写了程序集和nasm用于生产代码(主要是在微软上)。我的建议是不要在C ++构建器附近找到你不必要的东西。学习可以是一种艺术,你学习的方式与结果有很大关系。 C ++ Builder与汇编的集成是通过South Compton绕道而行的。尽管它可能不是你正常工作的方式,但是在纯命令行中学习nasm会花费大量时间。