Borland/Embarcadero 内联汇编

Inline Assembly with Borland/Embarcadero

这里有一个简短的问题:

我正在尝试在 32 位 Windows7 上使用 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 运行time 错误弹出窗口,它在几秒钟后消失并终止程序。

运行 调试,我似乎在它挂起之前成功到达第一个 int 0x21,此时 Borland 给我消息:

Project Project1.exe raised exception class $C00000005 with message 'access violation at 0x00401213: read of address 0xffffffff'.

我的理论是我没有正确初始化具有 256 字节偏移量的段(NASM 会在指令集的开头使用类似 org 0x100 的内容)。但我不完全确定这就是问题所在。

有什么想法吗?

这些 int 0x21 说明是针对 MS-DOS 而不是 Windows。它们在 Windows 程序中有其他含义,结果是你火上浇油。

我主要在 C++ Builder 中工作,但我也编写了汇编程序,nasm 用于生产代码(主要在微处理器上)。我的建议是不要为不需要的任何事情接近 C++ 构建器。学习可以是一门艺术,你学习的方式与结果有很大关系。 C++ Builder 与汇编的集成是通过南康普顿绕道而行的。尽管这可能不是您通常的工作方式,但花大量时间在纯命令行中学习 nasm 将获得巨大回报。