이 프로그램에 간격의 일부를 용서하십시오 테이블에 그들은 현재 여기 문자열의 문자를 카운트하고,
을 표시하는 방법을보다 내가 다른 간격으로 표시 탭을 사용하고있는 편집기를 표시 시도 사용자 입력 문자열의 문자 수를 계산하려고합니다..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
값에서
_CntBack : _ snippet에는 __ 적어도 2 개의 추가 문제가 있습니다 _. 이걸 보여줬으면 내 업보트를 받았을거야! – Fifoernik
호기심에서 CntBack 루프를 옮기는 것이 잘 돌아갔습니다. 내가 발견 한 유일한 문제는 결국 프로그램의 여러 기능을 여러 번 구현할 때 실제로는
buffer
을 지우지 않았기 때문입니다. 이 실수를 저에게 지적하여 비슷한 실수를 다시하지 않을 수 있습니까? –