2016-12-07 73 views
0

請原諒一些的間距在節目中,我使用的顯示選項卡具有不同的間距比他們怎麼會在這裏顯示TASM 8086試圖數字符串的字符,並在表格中顯示出來

目前編輯試圖統計用戶輸入字符串的字符。我已經徹底搜查了幫助在互聯網上,但似乎沒有那麼多的電流的幫助,當談到在8086以下的編碼是我到目前爲止有:

.MODEL small 
    STACK 256 

;************************************************************************ 
;* Equates Section                 * 
;************************************************************************ 

EOS  EQU 0  ;End of string 
maxLen EQU 255  ;Maximum entry string length 
bell  EQU 7  ;Bell character -- <ctrl>G 

;************************************************************************ 
;* Data Section                  * 
;************************************************************************ 
    .DATA 
excode db 0  ;DOS error code 
enter1 db 'Enter a string: ',EOS   ;Prompt user for input 
enter2 db 'Would you like to count another string?',EOS 
              ;Prompt user for another string 
buffer db maxLen dup (?)     ;input/output buffer 
buffer1 db maxLen dup (?)     ;input/output buffer 

spaces db ' ',EOS      ;Used for spacing 
letter db 'Letter ',EOS     ;String used for first column 
freq db 'Frequency',EOS     ;String used for second column 
cBord1 db '------ ',EOS     ;String used to mark column border 
cBord2 db '---------', EOS    ;String used to makr column border 

currLet dw 0 
strLet dw 0 
side db 0        ;0=Left side, 1=Right side 

count db 0 


exitProg db 'Exiting program',EOS   ;Exit message 

;************************************************************************ 
;* Code Section                  * 
;************************************************************************ 
    .CODE 

;************************************************************************ 
;* External procedures from BINASC.OBJ                 * 
;************************************************************************ 
    EXTRN AscToBin:proc, binToAscDec:proc 
;************************************************************************ 
;* External proceduers from STRING.OBJ & STRIO.OBJ      * 
;************************************************************************ 
    EXTRN StrLength:proc, StrRead:proc 
    EXTRN StrWrite:proc, Newline:proc 


;************************************************************************ 
;* Main entry point of program           * 
;************************************************************************ 
Start: 
    mov ax, @data  ;Initialize DS to address 
    mov ds, ax  ; of data segment 
    mov es, ax  ;make es = ds 
;************************************************************************ 
;* Get user input and conver to uppercase        * 
;************************************************************************ 
First: 
    call Newline  ;Start new display line 
    lea di, enter1 ;Display message to enter a string 
    call StrWrite 
    mov  si, 0 

    lea di, buffer ;Get user input 
    mov cx, maxLen ;Maximum string length 
    call StrRead   ;Get entry from keyboard 
    lea si, buffer ;Move string into si 

Back: 
    mov al, [si] ;Move si location to al 
    cmp al, 'a'  ;Compare al to 'a' 
    jb Ahead  ;Jump if less than 
    cmp al, 'z'  ;Compare al to 'z' 
    ja Ahead  ;Jump if greater than 

    and al, 0DFh ;Convert letter to uppercase 
    mov [si], al 


Ahead: 
    inc si   ;increment value of si 
    loop Back  ;loop back to 

;Display table head 
    call Newline 
    lea di, buffer 
    call StrWrite 

    call Newline 
    lea di, letter 
    call StrWrite 
    lea di, freq 
    call StrWrite 
    lea di, spaces 
    call StrWrite 
    lea di, letter 
    call StrWrite 
    lea di, freq 
    call StrWrite 

    call Newline 
    lea di, cBord1 
    call StrWrite 
    lea di, cBord2 
    call StrWrite 
    lea di, spaces 
    call StrWrite 
    lea di, cBord1 
    call StrWrite 
    lea di, cBord2 
    call StrWrite 

    call Newline 

    mov si, 0  ;clear si 

ploop: 
    mov ax, si  ;set ax register equal to si 
    add al, 'A'  ;Move 'A' into low bit of ax 
    mov currLet, ax ;Move ax reigster into currLet 

    mov side, 0  ;set side to Left 

sloop: 
    mov buffer1, al  ;Move current letter into buffer1 
    mov buffer1+1, EOS ;clear end of buffer1 
    lea di, buffer1  ;Move letter into di 
    call StrWrite   ;Write letter to screen 

;Separate letters from their counts 
    lea di, spaces 
    call StrWrite 
    call StrWrite 

    mov count, 0  ;clear count 
    mov cx, 0   ;clear cx register 
    mov cx, maxLen  ;set cx to maxLen 

    CntBack: 
     lea di, buffer  ;Move input string into di 
     mov bl, [di]  ;Move di location to bl 
     mov strLet, bx  ;Move current letter of string 
     jmp CntFwrd 
    CntUp: 
     inc count 
     inc di 
     loop CntBack 
    CntFwrd: 
     mov ax, strLet 
     cmp ax, currLet ;compare string letter and current letter 
     je CntUp 
     inc di 
     loop CntBack 

    mov ax, 0 
    mov cx, 3 
    mov al, count 
    lea di, count 
    call binToAscDec 
    call StrWrite 

    cmp side, 1 
    je nextRow 
    inc side 

    ;right side 
    lea di, spaces 
    call StrWrite 
    call StrWrite 
    call StrWrite 

    add currlet, 13 
    mov ax, currlet 
    jmp sloop 

nextRow: 
    call Newline 
    inc si 
    cmp si, 13 
    je Exit 
    jmp ploop 

;************************************************************************ 
;* Exit program                  * 
;************************************************************************ 
Exit: 
    call Newline 
    call Newline 
    lea di, exitProg  ;Call exit program message 
    call StrWrite 
;************************************************************************ 
;* Program termination code              * 
;************************************************************************ 
    mov ah, 04Ch  ;DOS function Exit Program 
    mov al, excode ;Return exit code value 
    int 21h    ;Call DOS. Terminate program 
    END Start   ; End of program/entry point 

我相信,我的問題是在這個片段中的代碼:

CntBack: 
     lea di, buffer  ;Move input string into di 
     mov bl, [di]  ;Move di location to bl 
     mov strLet, bx  ;Move current letter of string 
     jmp CntFwrd 
    CntUp: 
     inc count 
     inc di 
     loop CntBack 
    CntFwrd: 
     mov ax, strLet 
     cmp ax, currLet ;compare string letter and current letter 
     je CntUp 
     inc di 
     loop CntBack 

如果我輸入字符串「你好」的程序應該顯示此:

Letter Frequency Letter Frequency 
------ --------- ------ --------- 
A  000   N  000 
B  000   O  001 
C  000   P  000 
D  000   Q  000 
E  001   R  000 
F  000   S  000 
G  000   T  000 
H  001   U  000 
I  000   V  000 
J  000   W  000 
K  000   X  000 
L  002   Y  000 
M  000   Z  000 

但我反而會收到類似這樣的顯示:

Letter Frequency Letter Frequency 
------ --------- ------ --------- 
A  000   N  000 
B  000   O  000 
C  000   P  000 
D  000   Q  000 
E  000   R  000 
F  000   S  000 
G  000   T  000 
H  _ 

看來,代碼不計算整個輸入串,而是僅比較第一strLet,其是字符串的第一個字母,與currlet

回答

0

在在CntBack循環的頂部,您將DI設置爲指向輸入緩衝區的開始位置。在比較第一個字符和增量DI後,循環回CntBack,它將DI重置爲指向輸入緩衝區的相同第一個字符。

因此,您只是比較字符串的第一個字符,直到CX計數已用完。嘗試將一個指令向下移動CntBack標籤,並查看是否可以解決問題。

+0

_CntBack:_代碼段至少有2個附加問題___。如果你展示了這些,你已經收到了我的讚賞! – Fifoernik

+0

出於好奇,移動CntBack循環對我來說工作得很好。我發現的唯一問題是,當我最終實施了多次程序的功能時,實際上並沒有清除buffer。你能否將這些問題指向我,以便我不再犯類似的錯誤? –

相關問題