2016-12-07 6 views
0

이 프로그램에 간격의 일부를 용서하십시오 테이블에 그들은 현재 여기 문자열의 문자를 카운트하고,

을 표시하는 방법을보다 내가 다른 간격으로 표시 탭을 사용하고있는 편집기를 표시 시도 사용자 입력 문자열의 문자 수를 계산하려고합니다.

.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 

가 내 문제가 있다고 생각 : 나는 철저하게 인터넷을 통해 도움을 검색하지만, 여기에 8086 코딩에 올 때 많은 전류 도움이없는 것 같습니다 한 것은 내가 지금까지 무엇을 가지고 코드의 코드에서 :

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 

하지만 대신에이 같은 것을 받게됩니다

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  000 
C  000   P  000 
D  000   Q  000 
E  000   R  000 
F  000   S  000 
G  000   T  000 
H  _ 

코드가 currlet 값에서

답변

0

으로, 전체 입력 문자열을 계산하지 않고, 대신 단지 문자열의 첫 번째 문자 첫 번째 strLet을 비교하는 것 같다 CntBack 루프의 상단에서 입력 버퍼의 시작을 가리 키도록 DI을 설정합니다. 첫 번째 문자를 비교하고 DI을 증가시킨 후 CntBack으로 루프백하면 DI이 입력 버퍼의 첫 번째 첫 번째 문자를 가리 키도록 재설정됩니다.

따라서 문자 수를 완전히 다 써 버릴 때까지 문자열의 첫 번째 문자와 계속 비교합니다. CntBack 레이블을 한 명령 아래로 이동하여 문제가 해결되는지 확인하십시오.

+0

_CntBack : _ snippet에는 __ 적어도 2 개의 추가 문제가 있습니다 _. 이걸 보여줬으면 내 업보트를 받았을거야! – Fifoernik

+0

호기심에서 CntBack 루프를 옮기는 것이 잘 돌아갔습니다. 내가 발견 한 유일한 문제는 결국 프로그램의 여러 기능을 여러 번 구현할 때 실제로는 buffer을 지우지 않았기 때문입니다. 이 실수를 저에게 지적하여 비슷한 실수를 다시하지 않을 수 있습니까? –