當前位置:編程學習大全網 - 編程語言 - 匯編程序詳解(請大俠幫忙解釋壹下匯編程序,統計輸入字符串中每個字符的個數)

匯編程序詳解(請大俠幫忙解釋壹下匯編程序,統計輸入字符串中每個字符的個數)

*********************************************************************************

程序將輸出從鍵盤輸入的字符,並顯示出相同的字符及相同字符的個數。

*********************************************************************************

註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

  • 上一篇:網絡參考書推薦?
  • 下一篇:android listview怎麽加載自定義布局,還必須是在代碼裏面寫
  • copyright 2024編程學習大全網