Borland / Embarcadero的内联装配

时间:2016-01-09 01:37:25

标签: c++ assembly c++builder-xe3

这是一个简单的问题:

我尝试在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之类的东西)。但我并不完全确定这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这些int 0x21说明适用于 MS-DOS 而非Windows。它们意味着Windows程序中的其他内容,结果导致您陷入其中。

答案 1 :(得分:0)

我主要在C ++ Builder中工作,但我也编写了程序集和nasm用于生产代码(主要是在微软上)。我的建议是不要在C ++构建器附近找到你不必要的东西。学习可以是一种艺术,你学习的方式与结果有很大关系。 C ++ Builder与汇编的集成是通过South Compton绕道而行的。尽管它可能不是你正常工作的方式,但是在纯命令行中学习nasm会花费大量时间。