Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在组件中以日历格式打印月份(tasm使用dosbox)。我的第一个月总是被切断_Assembly_X86 16_Dos_Tasm - Fatal编程技术网

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可以正常工作,除了几个月后打印出来的一些奇怪字符。谢谢你的帮助。另外,感谢你详细介绍我的错误。我是汇编语言新手,这真的很有帮助。谢谢你的帮助。还有,比谢谢你详细介绍我的错误。我是汇编语言新手,这真的很有帮助。