cseg segment
assume cs:cseg, ds:cseg
org 100H
begin:
mov es,cs:[video]
mov ax,3
int 10h
mov cs:[col],0fh
mov di,10 ;greeting msg will be printed after 10 spaces
lea si,greeting
call mess
call nline
call jan
call nline
mov ah,4ch
int 21h
col db 0
greeting db "Welcome to the 2015 Calendar ",0
video dw 0b800h
january db " January$",
string db "Sun Mon Tue Wed Thu Fri Sat$"
string1 db " 1 2 3 4 5$"
string2 db " 6 7 8 9 10 11 12$"
string3 db "13 14 15 16 17 18 19$"
string4 db "20 21 22 23 24 25 26$"
string5 db "27 28 29 30 31$"
mess proc
push ax
mov ah,cs:[col]
mov bh, 30
conmess:
mov al,cs:[si]
or al,al
jz endmess
mov es:[di],ax
mov es:[di+1],bh
inc si
add di,2
jmp conmess
endmess:
pop ax
ret
mess endp
nline proc
mov ah, 2 ; carriage return
mov DL, 0DH
int 21H
mov DL, 0AH ; line feed
int 21H
ret
nline endp
print:
;printing the line
mov bh,10h ;color attribute
mov ah,9
mov al,0 ;avoding extra characters
int 10h ;printing color
int 21h
ret
jan proc
lea dx,january ; load & display the STRIN
call print
call nline
lea dx, string ; load & display the STRING
call print
call nline
lea dx, string1 ; load & display the STRING
call print
call nline
lea DX, string2 ; load & display the STRING
call print
call nline
lea DX, string3 ; load & display the STRING
call print
call nline
lea DX, string4 ; load & display the STRING
call print
call nline
lea DX, string5 ; load & display the STRING
call print
call nline
ret
jan endp
cseg ends
end begin
答案 0 :(得分:2)
assume cs:cseg, ds:cseg
org 100H
因为您使用了org 100h
我假设您正在以DOS'.COM格式编写可执行文件。
mov di,10 ;greeting msg will be printed after 10 spaces
要生成10个空格,您需要设置DI = 20,因为在0B800h的视频RAM中,每个字符占用2个字节。
mess proc
push ax
mov ah,cs:[col]
mov bh, 30 ; You don't need this line
conmess:
mov al,cs:[si]
or al,al
jz endmess
mov es:[di],ax
mov es:[di+1],bh ; You don't need this line
inc si
add di,2
jmp conmess
endmess:
pop ax
ret
mess endp
通过直接写入视频RAM来显示问候语。为什么要插入两种方法来定义属性字节?
print:
mov bh,10h ; Delete this line
mov ah,9
mov al,0 ; Delete this line
int 10h ; Delete this line
int 21h
ret
其余的写作是通过DOS函数完成的。这个打印例程似乎混合了BIOS和DOS功能!对于DOS,您只需要AH = 9
mov ah,4ch
int 21h
Terminate函数要求您在AL寄存器中定义退出代码。使用mov ax,4C00h
。
代替麻烦地调用 nline 来生成CRLF,您可以轻松地将这两个字节写入要输出的字符串中。
像这个例子
string2 db " 6 7 8 9 10 11 12",13,10,"$"
您的大多数例程都使用PROC / ENDP声明,但 print 不是。请选择一个系统并坚持下去。
修改
由于所有字符串都显示在不同的行上,因此为其赋予颜色的最简单方法是使用所需的属性擦除当前行。这是你如何为第一个字符串
做的mov ax,0920h \
mov bx,001Eh ;Yellow on Blue | Best put this in a subroutine!
mov cx,80 |
int 10h /
lea dx,january
call print
call nline