有一些方法可以使用循环垂直打印字符,例如打印' 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
答案 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
指令,因为这些日子并不是非常快。AL
和AH
这样的字节大小的寄存器中时,您应该尝试使用字大小的AX
寄存器在单个操作中执行此操作。这同样适用于BX
,CX
和DX
寄存器。下一段代码适用上述内容:
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)