2015-03-27 8 views
0

Надеюсь, вы можете мне помочь. я не могу найти способ, чтобы написать слова в сборке в водопаде структуры, например:Напишите слова в сборке, не возвращаясь к началу линии.

one 
    two 
     three 

Я попытался seprate от 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 
+0

попробовать BIOS INT 10h Fn 0Eh, но завершите строку с помощью 0 вместо «$» –

+0

@ Функция телетайпа BIOS AlexjZhak 0Eh делает n ot зависит от любого разделителя. Он выводит единственный символ в регистре AL. – Fifoernik

+0

@ user3819295 В DOS 6.2 ваша программа работает отлично. Вы работаете в системе на базе LINUX? Возможно, смена кода 10 (\ n) в 11 (\ v) может сработать для вас. – Fifoernik

ответ

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

Хорошо, спасибо! – user3819295

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 

печати прок получает указатель на строку в DS: SI
Называйте это, как

mov si, offset my_string 
call print 

гораздо проще и быстрее, чем перемещение курсора

 Смежные вопросы

  • Нет связанных вопросов^_^