2013-07-12 31 views
1

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

注意:如果可能的话,我想直接从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); 
} 

回答

1

类似的东西,地址和printf不是程序集的一部分。您必须将其重写为实际的汇编代码,或者将要使用的宏和汇编程序复制到您的freedos环境中。

如果你想使用调试中所包括的FreeDOS你可以使用一个命令开始写汇编指令,n命令赋予一个名字和W编写代码的文件。

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

C:\ 

此示例程序只能通过INT退出程序20(该2 RCX表明之后的节目的长度写入到磁盘)

+0

上面贴的代码是从一本书我试图请继续。感谢您澄清从调试命名和写入文件的过程。我真正的问题是如何让上面的代码运行。我只能猜测它的C,我需要下载一个编译器,然后从DOS运行它。对此有何见解? – Ccorock

+0

如果你无法使用'EDIT'工作,你会如何编写这段代码?我会先解决这个问题,然后下载一个编译器(和库)或汇编器......或者两者兼而有之。 –

+0

你的书不推荐编译器吗?在dos的日子里,Borland是一个流行的编译器制造商,它确实使用__asm语法来处理你的示例,所以它可能与你的书相兼容。可以在http://cc.embarcadero.com/item/25636上找到以freedos运行的免费旧版本(您可能需要在网站上注册它) –