这里有一个快速的问题:
我正在尝试在 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 原生调试环境中工作。我期望的是对控制台的简单写入:$%&'
然后是成功终止。
但是,当我尝试Project1.exe
通过命令行运行时,我会立即得到一个标准的 Win7 运行时错误弹出窗口,它会在几秒钟后消失并终止程序。
运行调试,我似乎int 0x21
在挂起之前成功到达第一个,此时 Borland 给了我消息:
Project Project1.exe 引发异常类 $C00000005,并带有消息“0x00401213 处的访问冲突:读取地址 0xffffffff”。
我的理论是我没有正确初始化具有 256 字节偏移量的段(NASM 会使用类似org 0x100
指令集开头的东西)。但我不完全确定这是问题所在。
有任何想法吗?