c - 如何在 FreeDOS 中编写内联汇编

标签 c assembly inline-assembly dos

我正在尝试编写以下程序来转储 interrupt vector table在虚拟机中使用 FreeDOS。我知道 DEBUG 将允许我编写汇编程序,但我如何创建以下 IVTDUMP.COM 文件、保存并运行它?

注意:如果可能的话,我想尝试直接从 FreeDOS 完成这一切。我尝试使用 EDIT 命令,但它出错了,我很确定我遗漏了什么。

for 
( 
   address=IDT_255_ADDR;
   address>=IDT_001_ADDR;
   address=address-IDT_VECTOR_SZ,vector--
)
{
   printf("%03d   %08p   ",vector,address);

   __asm
  {
     PUSH ES
     MOV AX,0
     MOV ES,AX
     MOV BX,address
     MOV AX,ES:[BX]
     MOV ipAddr,AX
     INC BX
     INC BX
     MOV AX,ES:[BX]
     MOV csAddr,AX
     POP ES
   };
   printf("[CS:IP]=[%04X,%04X]\n",csAddr,ipAddr);
}

最佳答案

for、address 和 printf 之类的东西不是汇编的一部分。您将不得不将其重写为实际的汇编代码,或者将要使用的宏和汇编程序复制到您的 freedos 环境中。

如果您想使用 freedos 中包含的调试功能,您可以使用 a 命令开始编写汇编指令,使用 n 命令提供名称,使用 w 将代码写入文件。

C:\debug
-a
06BC:0100 int 20
06BC:0102
-n ivtdump.com
-rcx 2
-w
Writing 0002 bytes.
-q

C:\

本示例程序只是通过int 20退出程序。(rcx后面的2表示写入磁盘的程序长度)

关于c - 如何在 FreeDOS 中编写内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17609941/

相关文章:

C 根据位数更改 pragma pack 变量的值

linux - 为什么我没有得到段错误?

c - 获取栈的起始地址

c - ASM 内联调用 C 外部函数

c - 我需要创建一个程序,提示用户输入要读取的两个输入文件的名称。然后读取文件并显示统计信息

外部文件中的 C 函数无法正确返回?

c - For 循环和 While 循环在 C 中选择值

assembly - 需要帮助理解 E8 asm 调用指令 x86

assembly - 根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?

assembly - 读取 GDTR 的值