我使用 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
当我运行这个程序时,一个对话框告诉我:"程序没有符号表"
我做错了什么?非常感谢你!
答案 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模拟器中获得更好的行为......