assembly 8086汇编语言中的新行:我的文本打印阶梯式

k7fdbhmy  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(90)

我得到了像这样的阶梯输出

我的程序工作正常,除了当我打印一个新行,然后打印当前行中的内容时,它显示在下一行,但在它之前有一些空格。
该程序是这样的:(打印一个从0到9的多个数字的表):

data_seg segment
    I DB 0D
    J DB 0D
    R DB ?
    DIVER DB 10D
    data_seg ends

stack_seg segment
    stack_seg ends

code_seg segment
    MAIN proc far
        assume cs:code_seg, ds:data_seg, ss:stack_seg
        MOV AX,data_seg
        MOV DS,AX

        FOR1:
            MOV J,0D
            FOR2:
            MOV AX,0H
            MOV AL,I
            MUL J
            DIV DIVER 
            MOV R,AH
            ADD AL,48D
            MOV AH,0EH
            INT 10H
            MOV AL,R
            ADD AX,48D
            MOV AH,0EH
            INT 10H

            MOV AX,32D
            MOV AH,0EH
            INT 10H
            INC J 
            MOV AX,0
            MOV AL,J
            SUB AX,10D
            JNZ FOR2
         INC I
         MOV AX,10D
         MOV AH,0EH
         INT 10H
         MOV AX,0
         MOV AL,I
         SUB AX,10D
         JNZ FOR1

        MOV AX,4CH
        INT 21H
        MAIN endp
    code_seg ends
end MAIN

字符串

mwg9r5ms

mwg9r5ms1#

您需要打印新行 * 和 * 回车。

lo8azlld

lo8azlld2#

如果你使用emu80x86,这段代码应该可以做到。

mov dx,13
  mov ah,2
  int 21h  
  mov dx,10
  mov ah,2
  int 21h

字符串

idfiyjo8

idfiyjo83#

这将打印一个新行:
1)在数据段中添加:

linefeed db 13, 10, "$"

字符串
2)然后在需要新行的任何地方使用这个:

; new line
mov ah, 09
mov dx, offset linefeed
int 21h

omjgkv6w

omjgkv6w4#

正如anthony所说,根据你的汇编程序,你需要做一个回车和换行来转到下一行,并将光标放在该行的开头。对于MASM,你可以分别使用Call crlf或print值0dh和0ah。

hk8txs48

hk8txs485#

你得到了一个阶梯式的输出,因为在你想在另一行继续的代码中,你只需要将控制代码10发送到显示器:

MOV AX,10D
MOV AH,0EH
INT 10H

字符串
在DOS平台上,New Line两个字节表示:第一个字节称为 Carriage Return,它使用控制代码13,第二个字节称为 Line Feed,它使用控制代码10。
这个两字节的序列模仿了古代打字机的动作,每当你想继续下一行时,你就可以拉动一个杠杆。
这个杠杆有双重作用:

  • 首先,它会将 * 回车 * 到纸张的左侧
  • 然后(在仍然保持拉力的同时)辊子会转动一点,以便 * 喂入 * 新的 * 线 *。

在BIOS中,它看起来像:

mov  ax, 0E0Dh ; BIOS.Teletype
int  10h
mov  al, 10
int  10h


在DOS下,它看起来像:

mov  dl, 13
mov  ah, 02h  ; DOS.PrintCharacter
int  21h      ; -> AL=13
mov  dl, 10
int  21h      ; -> AL=10


如果你的程序已经包含了一个以13, 10, '$'结尾的字符串,那么将这3个字节移到下面的一行,适当地标记这一行,并输出新的一行:

mov  dx, crlf ; For MASM-type assemblers write `mov dx, offset crlf`
mov  ah, 09h  ; DOS.PrintString
int  21h      ; -> AL='$'

...

msg1 db 'stackoverflow rocks'
crlf db 13, 10, '$'


ps.虽然我们通常写13后面跟着10,模拟器emu8086似乎更喜欢10在13之前出现。很可能这是它的许多错误之一,而不是设计师的预期选择。
被广泛接受和接受的答案是:
你需要打印新行和回车
这就像说“要打印新行,你需要打印新行和回车”。
“New Line”是组合动作的名称,“Carriage Return”加上“Line Feed”是其组成部分。
即使在不需要回车码(13)的平台上,你也可以说:“To print new line,you need to print the linefeed code(10)"。

brvekthn

brvekthn6#

在emu8086中,您可以使用此功能:

newLine PROC FAR
MOV AH, 2
MOV DL, 10
INT 21H
MOV DL, 13
INT 21H
RET
newLine endp

字符串

r8uurelv

r8uurelv7#

尝试将车道用于线路返回

mov ax, 4c00h ; return to ms-dos
int 21h

字符串

相关问题