assembly A2118:TINY型号不能有段地址引用

gopyfrb3  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(109)

任务是编写一个汇编语言程序,查找目录中的第一个文件并显示其创建时间。当你启动程序时,什么也没发生。错误可能在哪里?使用MASM 611在DOSBox上执行编译,使用命令“ml.exe filename.asm”。

.model tiny
.stack 100h

.data
    DTA db 128 dup(0)
    path db "C:\*.*", 0
    filename db 13 dup(0)
    creation_time db "File created on: ", 0

.code
main proc
    mov ax, @data
    mov ds, ax

    mov ah, 1Ah ; Set Disk Transfer Area (DTA)
    mov dx, offset DTA
    int 21h

    ; Set the path to the catalog
    mov dx, offset path
    mov ah, 4Eh ; Find First File
    int 21h

    ; Start the file search cycle
search_loop:
    ; Check if the file is found
    cmp al, 0 ; AL = 0, if the file is not found or everything has already been checked
    je exit_search

    ; Print the time of file creation
    mov dx, offset creation_time
    mov ah, 09h ; String output
    int 21h

    ; Upload the year and month of creation
    mov cx, word ptr [DTA+20h] ; Year
    mov bx, word ptr [DTA+22h] ; Month

    ; Print year
    mov ah, 02h ; Character output
    mov dl, ch ; Outputting the most significant byte (tens)
    add dl, 30h ; Convert a number to a character
    int 21h

    mov dl, cl ; Output of the low byte (one)
    add dl, 30h ; Convert a number to a character
    int 21h

    ; Print the month
    mov ah, 02h ; Character output
    mov dl, bh ; Outputting the most significant byte (tens)
    add dl, 30h ; Convert a number to a character
    int 21h

    mov dl, bl ; Output of the low byte (one) 
    add dl, 30h ; Convert a number to a character
    int 21h

    ; Print a new line
    mov dl, 0Dh ; CR
    int 21h
    mov dl, 0Ah ; LF
    int 21h

    ; Find the following file
    mov ah, 4Fh ; Find Next File
    int 21h

    jmp search_loop ; Repeat the file search cycle

exit_search:
    mov ah, 4Ch ; End the program
    int 21h

main endp
end main

如果使用命令“ml. exe/AT filename.asm”编译,则会出现下一个错误:
A2118:TINY型号不能有段地址引用
也许有人知道原因是什么。

roqulrg3

roqulrg31#

它在抱怨mov ax, @data。不要在.com可执行文件中这样做(或mov ds, ax),因为没有DOS元数据来填充段值。
.com可执行文件启动时,DS * 已经 * 正确设置(设置为与其他段相同的值,这就是tiny内存模型)。使用org 100h告诉汇编程序程序的顶部相对于这些段基址的偏移量,因此偏移量可以作为绝对地址正确工作。
.com可执行文件只是一个平面二进制文件,从文件的顶部(文件的第一个字节)开始执行。节在输出文件中是不可见的,但是汇编器会将.code放在.data之前,不管源代码的顺序如何,所以执行将从.code的顶部开始。所以这实际上不是一个问题,谢谢@Michael Petch指出这一点。

相关问题