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 将获得巨大回报。
这里有一个简短的问题:
我正在尝试在 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 将获得巨大回报。