Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编语言中不带回车符的新行_Assembly_Dos_X86 16_Dosbox - Fatal编程技术网

Assembly 汇编语言中不带回车符的新行

Assembly 汇编语言中不带回车符的新行,assembly,dos,x86-16,dosbox,Assembly,Dos,X86 16,Dosbox,我正在dosbox assembly上做一个程序,在那里我按对角线打印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

我正在dosbox assembly上做一个程序,在那里我按对角线打印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
问题是,当我添加新行时,光标会返回到下一行的开头,因此无法对角打印。是否有一种方法可以打印新行,但光标保持在当前位置?我在某个地方读到,“换行”可以解决我的问题,但它已被更改为“新行”,在添加新行后,光标自动返回到起始位置,自动“回车”


编辑:谢谢大家检查这个问题。除了loop、jmp和cmp之外,我们不允许使用其他函数。我的朋友知道了怎么做,但我仍然不理解他们代码的2/3,主要是关于again2和跳转循环。代码:

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,每次只向DI添加160。

当然,您可以打印正确的空格数,或者直接设置光标位置。显然,您可以通过在每行上打印越来越多的空格来解决此问题。我不熟悉过时的DOS/BIOS系统调用,但我认为至少有一些输出文本的方法需要CR/LF,而忽略CR会给您带来您想要的行为。除了INT21H DOS系统调用之外,还有许多不同的int函数组。有关16位软件中断函数的规范列表以及x86标记wiki中的其他链接,请参阅:感谢链接,我们将查看它!另一方面,在插入新行进行下一次输入后,是否可以使用int 10h设置光标位置,如上文所述?BIOS设置光标位置将覆盖其当前位置,也就是说,它独立于之前输出的任何数量的CR/LF。我想应该注意的是,如果你在真正的DOS下运行它,它会工作。这实际上是DOSBox的DOS仿真中的一个缺陷,在使用int 21hTo容纳OP也输出的空格字符时,换行符充当回车符和换行符,您的161 160必须是163 162。不要忘记,如果他碰巧拥有MDA,他可能需要0xb000-