2016-05-15 17 views
1

Wie würde ich die Zeichenfolge anzeigen, die der Benutzer eingegeben hat?Wie ausgegebene zentrierte Texteingabe von einem Benutzer in x86-Assembly ausgeben?

und ich brauche es in der Mitte von einem 80x25 Textbildschirm mit der folgenden Formel anzuzeigen:

column = (80 - Stringlänge)/2;
Reihe             = 25/2;

.MODEL TINY 
.386 
STACK 256  
DATASEG 
    msg db 'Enter string:$' 
    sbuf label word  ;адрес буфера для функции 0Ah 
    max db 0   ;максимальное количество символов 
    len db 0   ;количество фактически введенных 
    string db 254 DUP('#') ;буфер для строки (адрес строки) 
    ;string db 255,0, 256 dup (' ') 
    new db 0ah, 0dh, '$' 

CODESEG   
start:  
    mov ax,@data 
    mov ds,ax 
    mov ah,09h 
    mov dx,offset msg 
    int 21h 
    mov ah, 0Ah 
    mov dx,offset string 
    int 21h 

    xor ax,ax 
    mov al,offset string+1 
    inc dx 
    add dx, ax 
    mov si,dx 
    mov ah,09h 
    mov dx,offset new  ;output new line symbol 
    int 21h 

    std      ;устанавливаем флаг направления дляпрохода обратно 
print_next_char: 
    lodsb     ;читаем символ из DS:SI и уменьшаем SI на 1 
    cmp si,offset string+1 ;конец строки? (то есть начало) 
    jb endprog    ; если да, то переход к концу программы 

    cmp al,0dh 
    je skip 
    cmp al,023h 
    je skip 

    movzx bx,al 
    dec bx 

    inc byte[bx+len] 
skip: 
    mov dl, al    ;загружаем прочитанный из строки символ в DL 
    mov ah,02h    ;DOS-функция вывода символа 
    ; int 21h    ;вызов DOS 
    jmp print_next_char ;возвращаемся к следующему символу 
endprog: 
    mov dx,offset new 
    mov ah,09h 
    int 21h 

    mov DX, OFFSET string ; ds:dx points to string 
    mov AH, 09h 
    int 21h 

    mov AX, 4C00h   ; Return to DOS with ERRORLEVEL=0 
    int 21h 
end start 

Meine Aufgabe ist es, eine ausführbare Datei (EXE) Programm zu entwickeln, das zunächst zeigt (Funktion 09h, DOS 21h-Interrupt) eine Einladung zu einer Kette von Zeichen über die Tastatur eingeben.

Nach Eingabe der Zeile (Funktion 0Ah, DOS 21h Interrupt) sollte das Programm seinen String zentriert auf dem Bildschirm anzeigen (Funktion 13h, BIOS 10h interrupt). Die Koordinate der Bildschirmposition, wo der Ausgang gelegt werden muss wie folgt berechnet wird:

column = (80 - dlina_stroki)/2;
            Reihe = 25/2;

die Zeichenfolge geben Sie den folgenden Puffer definieren:

; ... 
.data 
; ... 
    sbuf label word  ; buffer address 0Ah function 
    max db 0    ; the maximum number of characters 
    len db 0    ; the number is actually imposed 
    string db 254 dup (0) ; buffer line (row address) 
; ... 

Dann wird in dem Programm jedes der referenzierten sbuf s des Puffers, kann sie als separate Variablen verwendet werden.

Antwort

2
xor ax,ax 
mov al,offset string+1 
inc dx 
add dx, ax 
mov si,dx 

hier Ihre Absicht ist es, die Adresse des letzten Zeichens der Benutzereingabe zu berechnen, aber dann müssen Sie die fallen Offset-Tag und schreiben mov al, [string+1] oder sonst mov al, len schreiben.

cmp al,0dh 
je skip 
cmp al,023h 
je skip 

für einen Wagenrücklauf Compairing 0Dh ist hier nutzlos, da wird es nicht nach links gehen jeder gefunden, wie Sie tun.
Warum vergleichen Sie mit 23h das ist ein #?

movzx bx,al 
dec bx 
inc byte[bx+len] 

Sie verwenden das ASCII-Zeichen in AL als ein im Speicher ausgeglichen werden. Ich sehe nicht, wie das für Ihre Aufgabe von Nutzen sein wird.