程序將輸出從鍵盤輸入的字符,並顯示出相同的字符及相同字符的個數。
*********************************************************************************
註x8086的數組起始0還是1,我記不清了,我是按0算的,根據妳的情況看嘛......
DATA SEGMENT 數據段開始
BUFFER DB 100 定義BUFFER數據第1個數據DB類型,且值為100
DB ? 定義1空的DB類型。
DB 100 DUP(?) 定義100個DB類型的數據,初始化
CHARS DB 'INPUT:$' 定義字符串"INPUT:"以$為結束標識
DATA ENDS 數據段結束
CODE SEGMENT 代碼段
ASSUME CS:CODE,DS:DATA 段代碼聲明CS
MAIN PROC FAR 定義"MAIN"函數
***************************************************
PUSH DS 將數據段地址堆棧
SUB AX,AX 清零AX,AX=0
PUSH AX 將AX入棧,實際將壓入0堆棧中
MOV AX,DATA 把數據段起始地址放入AX中
MOV DS,AX 初始化DS(數據段地址)
********以上是固定的,又叫程序的初始化數據段*******
START: MOV DX,OFFSET CHARS 取CHARS的字符首地址放入DX中
MOV AH,9 將9號DOS中斷功能號,放入AH中,用於顯示DX所存的字符串
INT 21H 調用21號中斷
********以上用於顯示"INPUT:"字符串**********
MOV DX,OFFSET BUFFER 取CHARS的字符首地址放入DX中
MOV AH,0AH 將0A號DOS中斷功能號,用於從鍵盤緩沖輸入,並保存DX所存的地址中
INT 21H 調用21號中斷
********以上用於從鍵盤緩沖中輸入到BUFFER中,輸入的東西將放入BUFFER中*************
MOV DL,0AH 把“換行符”放入DL中
MOV AH,2 02號功能,將從DL中輸出壹個字符
INT 21H 調用21號中斷
*******以上用於換行1,輸出換行符**********
MOV DL,0DH 把“回車符”放入DL中
MOV AH,2 02號功能,將從DL中輸出壹個字符
INT 21H 調用21號中斷
*******以上用於換行2,輸出回車符**********
*******上兩用於換行*******
MOV SI,OFFSET BUFFER 把從鍵盤輸入的字符,BUFFER地址給SI
INC SI 指向第二個字符
MOV AL,[SI] 放入AL
INC SI 指向下壹個字符
MOV DL,[SI] SI指向的下壹個字符給DL
MOV DH,[SI] 同時給DH
MOV DI,SI DI指向BUFFER的第三個字符
MOV CL,AL CL=AL=BUFFER[1]=100
MOV CH,0 CH=0
MOV BL,1 BL=1
MOV BH,0 BH=0
DEC CL CL減1
GO1: INC SI SI指向下壹個字符
CMP DL,[SI] 比較BUFFER[i]與BUFFER[i+]是否相等
JNE TO1 不相等轉到TO1
INC BL 如果相等BL將加1
TO1: LOOP GO1 循環CX-1,轉到GO1
************以上函數遍歷BUFFER中所有字符,並將與BUFFER[1]相同的字符的個數放入BL中,**************
CALL OUTPUT 調用OUTPUT,輸出我們能看懂的十位數,顯示出來
MOV BL,1 BL=1
TO5: INC DI DI+1,批向下壹個地址,DI指向BUFFER第四個字符了
DEC AL AL減1,第壹次是AL=99
CMP AL,1 和1比較
JE TO3 如果是1轉到TO3
CMP DH,[DI] 和DH字符比較,BUFFER[1]是否相等
JE TO5 如果相等就回到TO5
MOV DL,[DI] 如果不相等的話,將DI指向的字符放入DL中,
MOV SI,DI SI=DI放入SI
MOV CL,AL CL=AL
MOV CH,0 CH=0,CX=CL
DEC CL CL=CL-1
GO2: INC SI 指向下壹個字符
CMP [SI],DL 和DL字符比較,BUFFER[1]是否相等
JNE TO2 如果相等就回到TO2
INC BL 相同時BL=BL+1
MOV [SI],DH 將相同的字符放入SI中
TO2: LOOP GO2 CL=CL-1
CALL OUTPUT 顯示相同的字符個數
MOV BL,1 BL重新計算,初始化為,因為本身就是壹個字符,如果有壹個相同就應該有2個相同字符了
JMP TO5 跳到TO5
TO3: CMP DH,[DI] 當AL=1,循環結束以後,將跳到這裏來
JE TO4 如果DH這時與DI裏地址裏所放的值相同,那麽就結束。
MOV DL,[DI] 否則[DI]放入DL中
MOV BL,1 給BL為1,因為這時,就只有壹個字符了,沒有與他相同的字符了。
CALL OUTPUT 把字符個數輸出.
TO4: RET
MAIN ENDP
;--------------------------
OUTPUT PROC 自定義函數
PUSH AX //
PUSH CX //
PUSHF //保存現場
MOV AH,2 調用DOS功能號02,將DL中的內容輸出,即BUFFER[1]輸出
INT 21H 調用INT 21中斷
MOV DL,20H “空格”的ASCII碼
MOV AH,2 調用DOS功能號02,將DL中的“空格”輸出
INT 21H
MOV AL,BL AL=BL,相同字符次數
MOV AH,0 AX=AL
MOV CL,10 CL=10
DIV CL AX=AX/CL=AL/10=BL/10,AL中為商,AH中為余數
ADD AH,30H AH=AH+30,將數字轉換成對應ASCII
ADD AL,30H AL=AL+30,將商轉換成對應的ASCII碼
MOV CH,AH CH放入余數的ASCII碼
******************以上是將BL轉換成十進制數***********
MOV DL,AL DL放入商的ASCII碼
MOV AH,2 調用DOS功能號02,將DL中的AL商值輸出,,,實際是重復次數的十位數
INT 21H
*****輸出十位數****
MOV DL,CH
MOV AH,2
INT 21H
******輸出個位數****
MOV DL,0AH
MOV AH,2
INT 21H
*******以上用於換行1,輸出換行符**********
MOV DL,0DH
MOV AH,2
INT 21H
*******以上用於回車2,輸出回車符**********
POPF //恢復現場
POP CX //
POP AX //恢復現場
RET //返回
OUTPUT ENDP
CODE ENDS
END MAIN