2016-05-15 1 views
1

Comment afficher la chaîne saisie par l'utilisateur?Comment afficher une entrée de texte centrée par un utilisateur dans un assemblage x86?

Et je dois l'afficher au centre d'un écran 80x25 avec la formule suivante:

colonne = (80 - longueur de la chaîne)/2;
rangée             = 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 

Ma tâche est de développer un programme exécutable (EXE), qui affiche d'abord (fonction 09h, interruption DOS 21 h) une invitation à entrer dans une chaîne de caractères à partir du clavier. Après avoir entré la ligne (fonction 0Ah, DOS 21h interruption), le programme doit afficher sa chaîne centrée sur l'écran (fonction 13h, interruption BIOS 10h). la coordonnée de la position de l'écran où la sortie doit être mis est calculé comme suit:

colonne = (80 - dlina_stroki)/2;
            ligne = 25/2;

Pour entrer dans la chaîne que vous pouvez définir le tampon suivant:

; ... 
.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) 
; ... 

Ensuite, dans le programme de chacun des référencé sbuf s du tampon, il peut être utilisé comme variables distinctes.

Répondre

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

ici votre intention est de calculer l'adresse du dernier caractère de l'entrée utilisateur, mais vous devez déposer l'étiquette de décalage et écrire mov al, [string+1] ou écrire autre mov al, len.

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

Compairing pour un retour chariot 0Dh est inutile ici car il n'y aura pas trouvé d'aller à gauche comme vous le faites.
Pourquoi comparez-vous à 23h qui est un #?

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

Vous utilisez le caractère ASCII dans AL comme un décalage dans la mémoire. Je ne vois pas comment cela pourrait être utile pour votre tâche.