没有回车的新行汇编语言

时间:2017-12-04 14:55:07

标签: assembly dos x86-16 dosbox

我在dosbox程序集上做一个程序,我在对角线上打印0到9。这是我目前的代码

code segment
assume cs:code, ds:code
org 100h

start:
mov ah, 02h
mov dl, 30h
mov ch, 30h
int 21h

again:
inc dl  ;output next number
mov bl, dl
mov dl, 0ah ;new line
int 21h
mov dl, 20h ;space
int 21h
mov dl, bl
int 21h

inc ch  ;increment counter
cmp ch, 39h ;if counter is at 9 end program
je terminate    
loop again


terminate:
mov ax, 4c00h
int 21h
code ends
end start

问题是当我添加一个新行时,光标会回到下一行的开头,因此无法对角打印。有没有办法可以打印新行,但光标停留在当前位置?我已经读过某个地方'换行'可以解决我的问题,但它已被改为'新线',在添加新线后,光标自动返回起始位置ala自动'回车'

编辑:谢谢大家查看这个问题。除了loop,jmp和cmp之外,我们不允许使用其他功能。我的朋友想出了怎么做,但我仍然不明白他们的代码中有2/3,主要是在again2和jump循环。代码:https://pastebin.com/Vji29VL3

1 个答案:

答案 0 :(得分:1)

BIOS功能的替代方案是直接写入视频。

      mov     al, 30H
      mov     cx, B800H
      mov     es, cx
      xor     di, di               ; Change if you don't want to start at top/left.
      mov     cx, 161              ; STOSB has already incremented by one.

Loop:
      stosb
      add     di, cx
      inc     al
      cmp     al, 9
      jbe     Loop

当然,这会做一些假设,尤其是您正在写入第0页,并且属性设置为实际显示的内容。如果您愿意,也可以在AH中建立属性,然后使用STOSW,每次只添加160到DI。