【问题标题】:How to write inline assembly in FreeDOS如何在 FreeDOS 中编写内联汇编
【发布时间】:2013-07-12 01:30:51
【问题描述】:

我正在尝试编写以下程序以在虚拟机中使用 FreeDOS 转储 interrupt vector table。我知道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);
}

【问题讨论】:

    标签: c assembly inline-assembly dos


    【解决方案1】:

    诸如 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,我需要下载一个编译器,然后从 DOS 运行它。对此有何见解?
    • 如果您无法让EDIT 工作,您将如何编写此代码?我会先解决这个问题,然后下载编译器(和库)或汇编器......或两者兼而有之。
    • 你的书不推荐编译器吗?在 dos Borland 时代,它是一个流行的编译器制造商,它确实像您的示例一样使用 __asm 语法,因此它可能与您的书兼容。可以在 cc.embarcadero.com/item/25636 找到可以在 freedos 中运行的免费旧版本(您可能需要在网站上注册)
    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 2014-08-06
    • 2012-10-20
    • 2019-03-14
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多