Assembly 在组件中以日历格式打印月份(tasm使用dosbox)。我的第一个月总是被切断
第一个月的前两条线路被切断了,我不知道为什么。不管你是改变打印顺序还是删除四月号;如果你那样做,梅也会被切断。我是Assembly 在组件中以日历格式打印月份(tasm使用dosbox)。我的第一个月总是被切断,assembly,x86-16,dos,tasm,Assembly,X86 16,Dos,Tasm,第一个月的前两条线路被切断了,我不知道为什么。不管你是改变打印顺序还是删除四月号;如果你那样做,梅也会被切断。我是 .model tiny .data Apr db " April 2017 ",13,10 db "Sun Mon Tue Wed Thu Fri Sat",13,10 db " 1 ",13,10
.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) .model tiny的数据和代码在同一段中,您需要从数据部分跳转到起始地址。由于您已经有2个分段,更改为
.model small
并删除.org修复了此问题(这包括需要初始化数据段DS)
2) DOS Int 21/9打印它找到的所有东西,最多打印一个“$”。所以只需要一张照片
3) DOS int 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
我对您的代码做了一些更改,现在它做了它应该做的事情: 1) .model tiny的数据和代码在同一段中,您需要从数据部分跳转到起始地址。由于您已经有2个分段,更改为
.model small
并删除.org修复了此问题(这包括需要初始化数据段DS)
2) DOS Int 21/9打印它找到的所有东西,最多打印一个“$”。所以只需要一张照片
3) DOS int 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
您有一个早期
END
指令。从: 结束指令
使用
END
指令标记源文件的结尾。语法如下所示:
END [ startaddress ]
startaddress
是一个可选符号或表达式,用于指定程序中要开始执行的地址
第一次结束打印
终止源,从而将程序减少到
mov ah, 09h
int 21h
ret
正如您可以看到的那样,使用Turbo调试器
这会导致观察到的行为
请注意,您可以使用PROC
/ENDP
对定义过程,但这不是强制性的-通常最好用大写字母编写指令,以使它们在读取源代码时突出
删除
结束打印
不足以修复程序。除了要求字符串以
$
(两者)结尾之外,当您链接对象文件时,TLINK会抱怨
致命:无法生成COM文件:数据低于初始CS:IP定义
这是意料之中的,因为COM文件格式是纯原始代码,根本没有元数据。入口点被定义为偏移量100h,不能使用完整版本的
END
指令强制到不同的地址,该指令采用[startaddress]
您必须向下移动打印过程
.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
您有一个早期END
指令。
从:
结束指令
使用END
指令标记源文件的结尾。语法如下所示:
END [ startaddress ]
startaddress
是一个可选符号或表达式,用于指定程序中要开始执行的地址
第一次结束打印
终止源,从而将程序减少到
mov ah, 09h
int 21h
ret
正如您可以看到的那样,使用Turbo调试器
这会导致观察到的行为
请注意,您可以使用PROC
/ENDP
对定义过程,但这不是强制性的-通常最好用大写字母编写指令,以使它们在读取源代码时突出
删除结束打印
不足以修复程序。
除了要求字符串以$
(两者)结尾之外,当您链接对象文件时,TLINK会抱怨
致命:无法生成COM文件:数据低于初始CS:IP定义
这是意料之中的,因为COM文件格式是纯原始代码,根本没有元数据。
入口点被定义为偏移量100h,不能使用完整版本的END
指令强制到不同的地址,该指令采用[startaddress]
您必须向下移动打印过程
.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
按照int 21h/ah=9
文档中的规定,字符串应以'$'
终止。model tiny
、org 100h
(.COM程序)和。数据
,。code
(.EXE程序)不匹配。您是构建.COM程序还是.EXE程序?显示用于生成程序的命令行。添加“$”也没有帮助。这实际上让情况变得更糟,因为只有一行正在打印:1617181920。我正在使用dosbox(tasm)。如果我不调用print,而是直接编写mov-ah、9和int-21h,那么.data和.code就可以正常工作,除了几个月后打印出来的一些奇怪字符之外。正如int-21h/ah=9
文档中指定的那样,字符串应该以'$
.model-tiny
,org 100h
(.COM程序)和.data
,.code
(.EXE程序)不匹配。您是生成.COM程序还是.EXE程序?显示用于生成程序的命令行。添加“$”也没有帮助。它实际上会使情况更糟,因为只有一行正在打印:16 17 18 19 20。我正在使用dosbox(tasm).如果我不调用print,而是直接编写mov ah、9和int 21h,.data和.code可以正常工作,除了几个月后打印出来的一些奇怪字符。谢谢你的帮助。另外,感谢你详细介绍我的错误。我是汇编语言新手,这真的很有帮助。谢谢你的帮助。还有,比谢谢你详细介绍我的错误。我是汇编语言新手,这真的很有帮助。