如何用汇编语言打印垂直字符

时间:2017-11-01 14:39:19

标签: assembly emu8086

有一些方法可以使用循环垂直打印字符,例如打印' l'从汇编语言中的(0,0)到(0,10)。我使用的是emu8086。我的意思是在不改变列的情况下在不同的行中打印

org 100h

mov ax, 3
mov ah, 0
mov al, 3
int 10h         

mov cl,10
print:
mov ah,02 
mov bh,0                        
mov dh,cl  ;y
mov dl,0  ; x
int 10h 

mov ah,09  
mov bh,0     
mov bl,00Fh 
mov al,'l'
mov cx, 1  
int 10h 
loop print  

ret

Output

1 个答案:

答案 0 :(得分:1)

mov ax, 3
mov ah, 0
mov al, 3

这些指示应该做什么?
我猜你忘了写int 10h来设置80x25文字视频模式吗?

程序中的基本错误(Ped7g中的所有注释都包含在内)是您只将CL寄存器初始化为循环计数器,其中loop指令取决于整个CX指令{1}}注册,而且您错误地修改了它,以便您可以将CX用于第二目的。

  

...从(0,0)打印'l'到(0,10)......

  • 要获得一个有效的程序,你可以在循环之外放置尽可能多的指令。 CX中的重复次数,BH中的显示页面,BL中的显示属性以及DL中的列都在整个循环期间都是不变的,因此可以是放在它外面。
  • 你也应该避免使用loop指令,因为这些日子并不是非常快。
  • 当您需要将值放在像ALAH这样的字节大小的寄存器中时,您应该尝试使用字大小的AX寄存器在单个操作中执行此操作。这同样适用于BXCXDX寄存器。

下一段代码适用上述内容:

    ORG  256
    mov  ax, 0003h        ;BIOS.SetVideoMode AH=00h, Mode 80x25 AL=3
    int  10h
    mov  bx, 000Fh        ;Display page BH=0, Display attribute BL=0Fh
    mov  cx, 1            ;Repetition count CX=1
    mov  dx, 0A00h        ;Row DH=10, Column DL=0
print:
    mov  ah, 02           ;BIOS.SetCursor
    int  10h 
    mov  ax, 0900h + 'l'  ;BIOS.DisplayCharacter AH=09h, Character AL='l'
    int  10h
    dec  dh               ;Go one row up
    jns  print            ;Will stop when DH becomes -1
    ret                   ;Back to DOS (works for a .COM program)