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
值
_CntBack:_代碼段至少有2個附加問題___。如果你展示了這些,你已經收到了我的讚賞! – Fifoernik
出於好奇,移動CntBack循環對我來說工作得很好。我發現的唯一問題是,當我最終實施了多次程序的功能時,實際上並沒有清除
buffer
。你能否將這些問題指向我,以便我不再犯類似的錯誤? –