2016-05-15 15 views
1

ユーザーが入力した文字列を表示するにはどうすればよいですか?x86アセンブリでユーザーが入力したテキストを出力する方法は?

そして、私は次の式での80x25テキスト画面の中央に表示する必要があります

カラム=(80 - 文字列の長さ)/ 2。
行            = 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 

私の仕事は、最初は(関数09H、21H DOSの割り込み)、キーボードから文字列を入力するための招待状を表示する実行ファイル(EXE)プログラムを、開発することです。

(関数0Ah、DOS 21h割り込み)行を入力すると、プログラムはその文字列を画面中央に表示する必要があります(関数13h、BIOS 10h割り込み)。次のように は、出力が置かれなければならないスクリーン位置の座標が計算される:

カラム=(80 - dlina_stroki)/ 2。
           行25/2;

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

次に、バッファの参照sbuf Sのそれぞれのプログラムの中で、それは別の変数として使用することができます。

では、次のバッファを定義することができ、文字列を入力します。

答えて

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

ここにあなたの意図は、ユーザー入力の最後の文字のアドレスを計算することですが、あなたはオフセットタグをドロップし、mov al, [string+1]を書いたり、他のmov al, lenを記述する必要があります。キャリッジリターン0DHためCompairing

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

任意のあなたがそうであるように、左に行くが検出されませんので、ここでは無用です。
の23hとはなぜ違いますか?

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

あなたは、メモリ内のオフセットとしてALでASCII文字を使用しています。私はそれがあなたの仕事のためにどのように使われるのか分かりません。

関連する問題