2016-05-15 53 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 

我的任務是建立一個可執行文件(EXE)計劃,該計劃最初顯示(功能09H,21H DOS中斷)的邀請,從鍵盤輸入字符的字符串。

進入(函數0Ah,DOS 21h中斷)行後,程序應該在屏幕上顯示其居中的字符串(函數13h,BIOS 10h中斷)。 其中輸出具有被投入計算如下畫面位置的座標:

柱=(80 - dlina_stroki)/ 2;
            row = 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

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

Compairing回車符0DH是無用的,因爲這裏不會有任何去發現,以左側爲你做。
你爲什麼要比較23h這是一個

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

您使用的是AL作爲內存偏移的ASCII字符。我不明白這對你的任務有什麼用處。

相關問題