Assembly Turbo汇编程序的使用

Assembly Turbo汇编程序的使用,assembly,dos,tasm,Assembly,Dos,Tasm,我使用的是IBM处理器,而我几乎还没有开始钻研x86汇编。现在我已经彻底阅读了一本汇编手册,我决定测试一个简单的程序(在屏幕上打印感叹号的程序): 现在,在《彼得·诺顿的IBM PC汇编语言书》一书中有一个类似的例子,它遵循以下思路: .MODEL SMALL .CODE MOV AH,2h MOV DL,2Ah INT 21h INT 20h END 我假设这个程序会根据ASCII表打印星号,但我无法测试它,因为我不知道如何处理TASM,因为我几乎没有

我使用的是IBM处理器,而我几乎还没有开始钻研x86汇编。现在我已经彻底阅读了一本汇编手册,我决定测试一个简单的程序(在屏幕上打印感叹号的程序):

现在,在《彼得·诺顿的IBM PC汇编语言书》一书中有一个类似的例子,它遵循以下思路:

.MODEL SMALL
.CODE
     MOV AH,2h
     MOV DL,2Ah
     INT 21h
     INT 20h
END
我假设这个程序会根据ASCII表打印星号,但我无法测试它,因为我不知道如何处理TASM,因为我几乎没有将它安装在包含Intel处理器的Dell Inspiron上(这意味着IBM系统)。在TASM的命令提示符中,我最终键入了以下几行代码,以便组装我调用的appromat.asm程序并运行它:

C:\TASM>TASM EXCLAMAT.asm;
C:\TASM>TLINK EXCLAMAT;
C:\TASM>TD EXCLAMAT.exe
当我运行这个程序时,一个对话框告诉我:“程序没有符号表”

我做错了什么?多谢各位

TD(Turbo调试器)是运行程序的错误工具。您只需在提示符下键入程序名:

C:\TASM>EXCLAMAT.exe
TD的消息“程序没有符号表”只是一个警告,您看到的是纯代码,没有标签或名称。要避免它:
TLINK/v惊叹号

TD(Turbo调试器)是运行程序的错误工具。您只需在提示符下键入程序名:

C:\TASM>EXCLAMAT.exe

TD的消息“程序没有符号表”只是一个警告,您看到的是纯代码,没有标签或名称。要避免它:
TLINK/v惊叹号

链接汇编的代码时,您没有收到一些警告吗?当我测试它时,有几个问题:

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

    致命:没有程序入口点

  • 生成.exe时,还需要使用
    .stack
    指令分配堆栈,否则会出现以下警告:

    警告:没有堆栈

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

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

;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
    地址开始
  • 不要指定堆栈
  • 您可以使用
    int20h
  • /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仿真器中,您会得到更好的行为…

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

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

    致命:没有程序入口点

  • 生成.exe时,还需要使用
    .stack
    指令分配堆栈,否则会出现以下警告:

    警告:没有堆栈

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

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

;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
    地址开始
  • 不要指定堆栈
  • 您可以使用
    int20h
  • /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仿真器中,您会得到更好的行为…

我很好奇这是干什么用的?学习汇编语言有很大的好处,但为什么现在使用TASM呢?“我使用IBM处理器”。你是说基于电源架构的CPU?或者你说的是与IBM PC兼容的计算机?我认为在过去的20年里,这个术语并没有被广泛使用,因为IBM在个人电脑行业的鼎盛时期早已过去;)迈克尔:IBM以自己的名义推出了Cyrix开发的686 CPU。虽然那也是很久以前的事了。不过,我同意大家的看法,尽快放下16位工具链,切换到(至少)32位保护模式。一旦切换到64位Windows,运行这些工具就会遇到麻烦我很好奇这是干什么用的?学习汇编语言有很大的好处,但为什么现在使用TASM呢?“我使用IBM处理器”。你是说基于电源架构的CPU?或者你说的是与IBM PC兼容的计算机?我认为在过去的20年里,这个术语并没有被广泛使用,因为IBM在个人电脑行业的鼎盛时期早已过去;)迈克尔:IBM以自己的名义推出了Cyrix开发的686 CPU。虽然那也是很久以前的事了。不过,我同意大家的看法,尽快放下16位的工具链,转而使用(至少)