下面codeS应打印字符串一月视频模式,但它打印一些符号来代替。我应该怎么做才能打印一月? [英] The following codes should print jan string in video mode but it prints some symbols instead. What should i do to print January?
本文介绍了下面codeS应打印字符串一月视频模式,但它打印一些符号来代替。我应该怎么做才能打印一月?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
.MODEL小
。数据扬DB一月。code
.386MOV AX,0B800h; (分配显存AX的首地址)
MOV ES,AX
子嘀,嘀
MOV CX,25 * 80
MOV AX,00H; (17H是蓝色背景,白色的前景。20H是ASCII空格)L:MOV ES:[二],斧头; (20H被存储在偶地址,17H被存储在奇)
加迪,2
弯曲部LMOV DI,560;(?=位置,你要写入(160 * Y + 2 * X))
MOV啊,17H;(?=属性一样17H)
MOV CX,27(?=长度字符串这里的hello world是11个字符长)
MOV SI,偏移月;(si的myMessage的第一个字符的地址)
L1:MOV人,[SI]
MOV ES:[二],斧
加迪,2
INC SI
环L1
解决方案
PROC显示字符串直接进入0B800h:
.MODEL小
.STACK 100H
。数据扬DB一月
我DB通过josmanaba@yahoo.com
点¯xDW?
ÿDW?
颜色分贝?。code;初始化数据段。
MOV AX,@data
MOV DS,AXMOV AX,0B800h; (分配显存AX的首地址)
MOV ES,AX;显示一月
MOV X,40
MOV Y,12
MOV颜色,17H
MOV DI,抵消扬
MOV CX,27;字符串长度。
调用displayB800;显示ME。
MOV X,50
MOV Y,22
MOV颜色,37H
MOV迪,我的偏移
MOV CX,27;字符串长度。
调用displayB800; FINISH程序。
MOV AX,4c00h
INT 21H; ----------------------------------------------
;参数:变量x,y,颜色。
; STRING抵消DI。
; STRING长度CX。
;假定ES = 0B800H。PROC displayB800
显示:
; GET Y(Y * 160)。
MOV AX,Y
MOV BL,160;一个文本行= 80 * 2个字节。
MUL BL; Y * 160。
; GET X(X * 2)。
MOV BX,X
SHL BX,1,X * 2,因为它是CHAR / ATTR。 SHL = PUSH一位LEFT(FAST乘以2)。
; X,Y TOGETHER(Y * 160 + X * 2)。这是OFFSET INSIDE B800。
加BX,AX
; PUT CHAR位置X,Y。
MOV啊,颜色
MOV等,[二]当前字符串CHAR。
MOV ES:[BX],AX; BX通知偏移INSIDE 0B800H。
;下一个字符。
INC迪
INC点¯x
循环显示 RET
ENDP
.model small
.data
Jan db " January "
.code
.386
mov ax, 0B800h ; (assign first address of video memory to AX)
mov es, ax
sub di,di
mov cx, 25*80
mov ax, 00h ; (17h is blue background, white foreground. 20h is blank space in ASCII)
L: mov es:[di], ax ; (20h gets stored in the even addresses, 17h gets stored in odd)
add di, 2
loop L
MOV di, 560 ;(? = position you want to write to (160*y + 2*x))
MOV ah, 17h ;(? = attribute like 17h)
MOV cx, 27 ;(? = length of string. Here "hello world" is 11 characters long)
MOV si, offset Jan ;(si has the address of the first character of myMessage)
L1: mov al, [si]
mov es:[di], ax
add di, 2
inc si
loop L1
解决方案
Proc to display strings directly into 0B800h :
.model small
.stack 100h
.data
Jan db " January "
Me db " By josmanaba@yahoo.com "
x dw ?
y dw ?
color db ?
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
mov ax, 0B800h ; (assign first address of video memory to AX)
mov es, ax
;DISPLAY JAN.
mov x, 40
mov y, 12
mov color, 17h
mov di, offset jan
mov cx, 27 ;STRING LENGTH.
call displayB800
;DISPLAY ME.
mov x, 50
mov y, 22
mov color, 37h
mov di, offset Me
mov cx, 27 ;STRING LENGTH.
call displayB800
;FINISH PROGRAM.
mov ax, 4c00h
int 21h
;----------------------------------------------
;PARAMETERS : VARIABLES X,Y,COLOR.
; STRING OFFSET IN DI.
; STRING LENGTH IN CX.
;ASSUME ES = 0B800H.
proc displayB800
displaying:
;GET Y (Y*160).
mov ax, y
mov bl, 160 ;ONE TEXT LINE = 80*2 BYTES.
mul bl ;Y*160.
;GET X (X*2).
mov bx, x
shl bx, 1 ;X*2 BECAUSE IT'S CHAR/ATTR. SHL=PUSH ONE BIT LEFT (FAST MULTIPLY BY 2).
;X,Y TOGETHER (Y*160 + X*2). THIS IS THE OFFSET INSIDE B800.
add bx, ax
;PUT CHAR IN POSITION X,Y.
mov ah, color
mov al, [ di ] ;CURRENT STRING CHAR.
mov es:[ bx ], ax ;NOTICE BX IS OFFSET INSIDE 0B800H.
;NEXT CHAR.
inc di
inc x
loop displaying
ret
endp
这篇关于下面codeS应打印字符串一月视频模式,但它打印一些符号来代替。我应该怎么做才能打印一月?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文