在装配中写入行而不返回行的开头(阶梯文本)

问题描述 投票:0回答:2

我找不到在瀑布结构中用汇编语言编写单词的方法,例如:

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
assembly newline dos x86-16
2个回答
0
投票

你将不得不回到线的起点,因为你需要一个换行符。换行,换行符将光标移动到下一行的开头。对于换行符,您需要一个空格和一个计数器来显示空白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

如果要缩进一个空格,请将计数器增加1,如果要缩进两个空格,则增加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

0
投票

Re:@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

比移动光标更简单,更快捷

© www.soinside.com 2019 - 2024. All rights reserved.