1

这里有一个快速的问题:

我正在尝试在 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指令集开头的东西)。但我不完全确定这是问题所在。

有任何想法吗?

4

2 回答 2

3

这些int 0x21说明适用于MS-DOS而不是 Windows。它们在 Windows 程序中意味着其他东西,结果你会火上浇油。

于 2016-01-09T01:42:44.367 回答
0

我主要在 C++ Builder 中工作,但我也为生产代码编写了汇编和 nasm(主要在 micros 上)。我的建议是不要靠近 C++ builder 做任何你不需要做的事情。学习可以是一门艺术,你学习的方式与结果有很大关系。C++ Builder 与程序集的集成是绕道南康普顿。尽管它可能不是您通常的工作方式,但在纯命令行中学习 nasm 将带来巨大的回报。

于 2016-10-20T15:48:52.483 回答