下面codeS应打印字符串一月视频模式,但它打印一些符号来代替。我应该怎么做才能打印一月? [英] The following codes should print jan string in video mode but it prints some symbols instead. What should i do to print January?

查看:195
本文介绍了下面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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆