使用Turbo汇编程序

时间:2014-06-05 00:51:21

标签: assembly dos tasm

我使用 IBM 处理器,而我几乎没有开始深入研究 x86 程序集。现在我已经仔细阅读了一本装配书,我决定在测试中放一个简单的程序(在屏幕上打印一个感叹号):

.MODEL SMALL
.CODE
     MOV AH,2h
     MOV DL,21h
     INT 21h
     INT 20h
END

现在,在这本名为 Peter Norton的IBM PC 汇编语言手册的书中有一个类似的例子:

.MODEL SMALL
.CODE
     MOV AH,2h
     MOV DL,2Ah
     INT 21h
     INT 20h
END

我认为这个程序会根据ASCII表打印一个星号,但我无法测试,因为我不知道如何处理TASM,因为我几乎没有将它安装在包含Intel处理器的Dell Inspiron上(这应该意味着IBM系统)。在TASM的命令提示符中,我最终键入了以下代码行,以便汇编我调用EXCLAMAT.asm并运行它的程序:

C:\TASM>TASM EXCLAMAT.asm;
C:\TASM>TLINK EXCLAMAT;
C:\TASM>TD EXCLAMAT.exe

当我运行这个程序时,一个对话框告诉我:"程序没有符号表"

我做错了什么?非常感谢你!

2 个答案:

答案 0 :(得分:4)

TD(Turbo Debugger)是运行程序的错误工具。您只需在提示符下输入程序名称:

C:\TASM>EXCLAMAT.exe

TD"程序的消息没有符号表"只是警告你看到纯代码,没有标签或名称。为了避免它:TLINK /v EXCLAMAT;

答案 1 :(得分:1)

在链接汇编代码时,您是否收到一些警告?我测试时有几个问题:

  • 您需要通过在代码开头设置标签来定义程序入口点,然后使用指令end label_defined,否则会出现此链接错误

      

    致命:没有程序入口点

  • 生成.exe时,您还需要使用.stack指令分配堆栈,否则您将收到此警告:

      

    警告:没有堆叠

  • int 20h通常用于终止.com程序,但它不适用于.exe。首选方法是使用int 21h调用AH = 4c来终止并指定返回码。有关详细说明,请参阅this MSDN entry

因此,要正确编译行为,您的程序将变为:

;produce a .exe file
; tasm exclamat.asm;
; tlink /v exclamat  (/v for including debug info for td)

.model small
.stack          ;if no value given, defaults to 1024

.code
entrypoint:

    mov ah,2h
    mov dl,21h
    int 21h

    ; terminate with int 21h / ah=4c instead of int 20h
    ; see http://support.microsoft.com/kb/72848/en-us
    mov ax,4c00h
    int 21h

end entrypoint  ;define the entry point to the specified label

如果您要生成.com文件,还有其他一些需求:

  • 程序集必须从100h地址
  • 开始
  • 不指定堆栈
  • 您可以使用int 20h
  • 结束
  • /t参数
  • 相关联

以下是修改过的相同程序:

;produce a .com file
; tasm exclamat.asm;
; tlink /t exclamat.obj

.model small

.code
    org 100h

entrypoint:
    mov ah,2h
    mov dl,21h
    int 21h
    int 20h
end entrypoint

顺便说一句,这些代码是在WXP主机上测试的,旧的tasm.exe似乎存在支持16位遗留代码的基础ntvdm进程的问题。如果你的控制台变得怪异(例如完成不再工作),你可能必须杀死ntvdm来解锁它。我猜你会在像DOSBox这样的dos模拟器中获得更好的行为......