任务是编写一个汇编语言程序,查找目录中的第一个文件并显示其创建时间。当你启动程序时,什么也没发生。错误可能在哪里?使用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型号不能有段地址引用
也许有人知道原因是什么。
1条答案
按热度按时间roqulrg31#
它在抱怨
mov ax, @data
。不要在.com
可执行文件中这样做(或mov ds, ax
),因为没有DOS元数据来填充段值。当
.com
可执行文件启动时,DS * 已经 * 正确设置(设置为与其他段相同的值,这就是tiny
内存模型)。使用org 100h
告诉汇编程序程序的顶部相对于这些段基址的偏移量,因此偏移量可以作为绝对地址正确工作。.com
可执行文件只是一个平面二进制文件,从文件的顶部(文件的第一个字节)开始执行。节在输出文件中是不可见的,但是汇编器会将.code
放在.data
之前,不管源代码的顺序如何,所以执行将从.code
的顶部开始。所以这实际上不是一个问题,谢谢@Michael Petch指出这一点。