在汇编中写行而不回到行的开头(阶梯文本)
Write lines in assembly with out going back to the start of the line (stair step text)
我找不到在瀑布结构中用汇编写单词的方法,例如:
one
two
three
我试图在 10 和 13 之间进行分离,但没有成功。这是到目前为止的代码:
.MODEL SMALL
.STACK 100h
.DATA
MyProgram DB 'word1',10,'word2',10,'word3','$'
.CODE
ProgStart:
MOV AX,@DATA
MOV BX,OFFSET MyProgram
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MyProgram
INT 21h
MOV AH,4ch
INT 21h
您将不得不回到行首,因为您需要换行。从本质上讲,换行符会将光标移动到下一行的开头。对于换行符,您需要一个空格 space 和一个计数器来显示空格 space n 次。此计数器随着您显示的每一行而增加。在 EMU8086 中制作的示例(只需复制、粘贴和 运行):
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
space DB ' $' ;BLANK SPACE.
spaces dw 1 ;COUNTER FOR BLANK SPACES.
.CODE
MOV AX,@DATA
MOV DS,AX
mov bx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
mov cx, spaces
display_spaces:
mov ah, 9
mov dx, offset space
int 21h
loop display_spaces ;CX-1. IF CX!=0 : DISPLAY NEXT SPACE.
inc spaces ;MOVE NEXT INDENT ONE SPACE TO THE RIGHT.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
dec bx ;LINES COUNTER.
mov cx, bx
loop display_text
MOV AH,4ch
INT 21h
如果你想缩进一个space,计数器加1,如果你想缩进两个space,加2,依此类推。
现在没有换行符,通过使用 GOTOXY,这样你就不需要回到行首,因为没有换行符:
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
row db 1 ;LINE NUMBER.
col db 1
.CODE
MOV AX,@DATA
MOV DS,AX
mov cx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
;GOTOXY.
mov ah, 2
mov bh, 0
mov dl, col
mov dh, row
int 10h ;BIOS SCREEN SERVICES.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
inc row ;Y COORDINATE ONE LINE DOWN.
inc col ;X COORDINATE ONE COLUMN RIGHT.
loop display_text
MOV AH,4ch
INT 21h
回复:@AlexanderZhak BIOS 电传打字功能 0Eh 不依赖于任何定界符。它输出AL寄存器中的单个字符。
其工作原理如下:
print:
mov bx, 7
mov ah, 0x0e
next_char:
lodsb
test al, al
jz exit
int 0x10
jmp next_char
exit:
ret
print proc 收到指向字符串的指针 DS:SI
称其为
mov si, offset my_string
call print
比移动光标更简单、更快捷
我找不到在瀑布结构中用汇编写单词的方法,例如:
one
two
three
我试图在 10 和 13 之间进行分离,但没有成功。这是到目前为止的代码:
.MODEL SMALL
.STACK 100h
.DATA
MyProgram DB 'word1',10,'word2',10,'word3','$'
.CODE
ProgStart:
MOV AX,@DATA
MOV BX,OFFSET MyProgram
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MyProgram
INT 21h
MOV AH,4ch
INT 21h
您将不得不回到行首,因为您需要换行。从本质上讲,换行符会将光标移动到下一行的开头。对于换行符,您需要一个空格 space 和一个计数器来显示空格 space n 次。此计数器随着您显示的每一行而增加。在 EMU8086 中制作的示例(只需复制、粘贴和 运行):
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
space DB ' $' ;BLANK SPACE.
spaces dw 1 ;COUNTER FOR BLANK SPACES.
.CODE
MOV AX,@DATA
MOV DS,AX
mov bx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
mov cx, spaces
display_spaces:
mov ah, 9
mov dx, offset space
int 21h
loop display_spaces ;CX-1. IF CX!=0 : DISPLAY NEXT SPACE.
inc spaces ;MOVE NEXT INDENT ONE SPACE TO THE RIGHT.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
dec bx ;LINES COUNTER.
mov cx, bx
loop display_text
MOV AH,4ch
INT 21h
如果你想缩进一个space,计数器加1,如果你想缩进两个space,加2,依此类推。
现在没有换行符,通过使用 GOTOXY,这样你就不需要回到行首,因为没有换行符:
.STACK 100h
.DATA
text DB 'hello world',13,10,'$'
row db 1 ;LINE NUMBER.
col db 1
.CODE
MOV AX,@DATA
MOV DS,AX
mov cx,10 ;HOW MANY LINES TO DISPLAY.
display_text:
;GOTOXY.
mov ah, 2
mov bh, 0
mov dl, col
mov dh, row
int 10h ;BIOS SCREEN SERVICES.
;DISPLAY TEXT.
MOV AH,9
MOV DX,OFFSET text
INT 21h
inc row ;Y COORDINATE ONE LINE DOWN.
inc col ;X COORDINATE ONE COLUMN RIGHT.
loop display_text
MOV AH,4ch
INT 21h
回复:@AlexanderZhak BIOS 电传打字功能 0Eh 不依赖于任何定界符。它输出AL寄存器中的单个字符。
其工作原理如下:
print:
mov bx, 7
mov ah, 0x0e
next_char:
lodsb
test al, al
jz exit
int 0x10
jmp next_char
exit:
ret
print proc 收到指向字符串的指针 DS:SI
称其为
mov si, offset my_string
call print
比移动光标更简单、更快捷