2017-04-17 21 views
0

第一个月的前两行被切断,我不知道为什么。如果您切换正在打印的订单或删除四月份,这并不重要;如果你这样做,也可能会被切断。我在程序集中以日历格式打印月份(使用dosbox的tasm)。我的第一个月不断被切断

.model tiny 
.data 

Apr   db "   April 2017  ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat",13,10 
       db "       1 ",13,10 
       db " 2 3 4 5 6 7 8 ",13,10 
       db " 9 10 11 12 13 14 15 ",13,10 
       db "16 17 18 19 20 21 22 ",13,10 
       db "23 24 25 26 27 28 29 ",13,10 
       db "30     ",13,10,0 

    May  db "   May 2017   ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat ",13,10 
       db "  1 2 3 4 5 6 ",13,10 
       db " 7 8 9 10 11 12 13 ",13,10 
       db " 14 15 16 17 18 19 20 ",13,10 
       db " 21 22 23 24 25 26 27 ",13,10 
       db " 28 29 30 31    " 


.code 
    org 100h 

    print : 
     mov ah,9 
     int 21h 
     ret 
      end print 

    start: 
    lea dx,Apr 
    call print 

    lea dx,May 
    call print 

    mov ah, 4ch 
    int 21h 

end start 
+1

正如'int 21h/ah = 9'的文档中指定的那样,字符串应该以''$''结尾。 – Michael

+0

'.MODEL tiny','组织100h'(.COM程序)和'.data',''.CODE(.EXE程序)不匹配。你建立.COM程序还是.EXE程序?显示您构建程序的命令行。 – rkhb

+0

添加'$'也没有帮助。它实际上使情况变得更糟,因为只有一行正在打印:16 17 18 19 20. – ajstc

回答

1

我做了一些修改代码,现在它做什么,它应该:

1).MODEL微小的在同一网段的数据和代码,你需要在一个跳跃数据部分到您的起始地址。因为你已经有2个区域,改为.model small并删除.org固定这个(这包括需要初始化数据段DS)

2)DOS Int 21/9打印everthing它发现,最高为“$” 。所以需要

3只有一个打印)DOS中间体21/4C回报AL为错误代码,因为没有错误,更好地返回0

.model small 
.data 

    Cal  db "   April 2017  ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat",13,10 
       db "       1 ",13,10 
       db " 2 3 4 5 6 7 8 ",13,10 
       db " 9 10 11 12 13 14 15 ",13,10 
       db "16 17 18 19 20 21 22 ",13,10 
       db "23 24 25 26 27 28 29 ",13,10 
       db "30     ",13,10,0 

    May  db "   May 2017   ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat ",13,10 
       db "  1 2 3 4 5 6 ",13,10 
       db " 7 8 9 10 11 12 13 ",13,10 
       db " 14 15 16 17 18 19 20 ",13,10 
       db " 21 22 23 24 25 26 27 ",13,10 
       db " 28 29 30 31    " 

    EndStr db "$" ; tell DOS to stop printing here 


.code 

start: 
    mov ax,@data  ; initialize data segment 
    mov ds,ax 

    mov dx,offset Cal ; print Calender 
    mov ah,9 
    int 21h 

    mov ax, 4c00h  ; return to DOS 
    int 21h 

end start 
3

你有一个早期END指令。
TASM 5 manual

END指令
使用END指令来标记你的源文件的结束。语法如下:

END [ startaddress ] 

startaddress是一个可选的符号或表达式,指定在你的程序中要开始执行的地址。

第一end print终止源从而减少了程序

mov ah, 09h 
int 21h 
ret 

正如你可以采用Turbo调试器

Turbo debugger showing missing pieces of code

这导致观察到的行为看到。

作为说明,您可以使用PROC/ENDP对来定义过程,但这不是强制性的 - 通常以大写形式编写指令以使其在阅读源代码时突出显示是一种很好的做法。


删除end print是不足以解决您的程序。
除了INT21h/AH=9要求字符串以$(两者都是)作为终止的事实外,当您来链接TLINK将会抱怨的对象文件时。

致命:无法生成COM文件:下面初始CS数据:IP定义

这是可以预期的,因为COM文件格式是纯的,原始代码与没有元数据的。
入口点定义为偏移100H而不能强制到不同的地址与END指令的完整版本 - 即需要[startaddress]

你必须移动print程序下来。

.model tiny 
.data 

Apr   db "   April 2017  ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat",13,10 
       db "       1 ",13,10 
       db " 2 3 4 5 6 7 8 ",13,10 
       db " 9 10 11 12 13 14 15 ",13,10 
       db "16 17 18 19 20 21 22 ",13,10 
       db "23 24 25 26 27 28 29 ",13,10 
       db "30     ",13,10,24h 

    May  db "   May 2017   ",13,10 
       db "Sun Mon Tue Wed Thu Fri Sat ",13,10 
       db "  1 2 3 4 5 6 ",13,10 
       db " 7 8 9 10 11 12 13 ",13,10 
       db " 14 15 16 17 18 19 20 ",13,10 
       db " 21 22 23 24 25 26 27 ",13,10 
       db " 28 29 30 31    ", 24h 


.code 

org 100h 




    start: 

    lea dx,Apr 
    call print 

    lea dx,May 
    call print 

    mov ah, 4ch 
    int 21h 

print : 
     mov ah,9 
     int 21h 
     ret 
+0

谢谢你的帮助。另外,感谢您详细介绍我的错误。我对汇编语言很陌生,这真的很有帮助。 – ajstc

相关问题