匯編語言系列之匯編實現(xiàn)字符串操作
軟件:emu8086
語言:匯編語言(Assembly)
注意:本文列出了字符串匹配和字符串輸入顯示的代碼,全部代碼為博主獨自一人編寫,會有瑕疵,謹慎使用。
1.字符串匹配設計
1.1設計要求:
要求掌握提示信息的設置及讀取鍵入信息的方法。設計程序,從鍵盤輸入兩個字符串進行比較,如相同,則顯示“MATCH”,否則顯示“NO MATCH”。
1.2設計思路:
DOS功能調(diào)用輸入兩個字符串,通過CMPSB指令一個字節(jié)一個字節(jié)比較字符串,相同輸出MATCH,不同輸出NO MATCH。

1.3程序清單:
DATA SEGMENT
pkey DB 0DH,0AH, 'please input str1 end by enter:','$'
qkey DB 0DH,0AH,'please input str2 end by enter:','$'
skey DB 0DH,0AH,'MATCH','$'
tkey DB 0DH,0AH,'NO MATCH','$'
BUFF1 DB 101,0,101 DUP(0)
BUFF2 DB 101,0,101 DUP(0)`
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX ;數(shù)據(jù)段和堆棧段初始化
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能調(diào)用,輸出字符串
LEA DX,BUFF1
MOV AH,0AH
INT 21H ;輸入第一個字符串到BUFF1緩沖區(qū)
LEA DX,qkey
MOV AH,9
INT 21H
LEA DX,BUFF2
MOV AH,0AH
INT 21H ;輸入第二個字符串到BUFF2緩沖區(qū)
LEA SI,BUFF1 ;將第一個字符串給SI
LEA DI,BUFF2 ;將第二個字符串給DI
MOV CX,53 ;給計數(shù)器值
CLD ;清方向標準DF
REPZ CMPSB ;一個字節(jié)一個字節(jié)比較字符串,SI和DI遞增
JZ MATCH ;全部字節(jié)都相等輸出MATCH
LEA DX,tkey
MOV AH,9
INT 21H ;不等輸出NO MATCH
JMP START
MATCH: LEA DX,skey
MOV AH,9
INT 21H ;DOS功能調(diào)用,輸出MATCH
JMP START
CODE ENDS
END START
1.4程序運行結果及分析:
主要是學會CMPSB指令的使用,清零DF標志使DI,SI遞增,然后實現(xiàn)一個字節(jié)一個字節(jié)的比較。

圖7 字符串匹配設計結果
2.字符串輸入及顯示設計
2.1設計要求:
要求掌握字符和數(shù)據(jù)的顯示方法。設計程序,接收鍵盤鍵入字符串,包括字符和數(shù)字,并在終端顯示。設計要求:有鍵入和結束提示信息,如在鍵入字符串之前提示:INPUT STRING,THE END FLAG IS $。要求統(tǒng)計鍵入字符串中數(shù)字(0-9)的個數(shù)和字符的個數(shù),分行顯示。
2.2設計思路:
判斷在0~9范圍內(nèi)DI累加,判斷在a~z和A~Z范圍內(nèi)SI累加,然后將SI和DI即字母個數(shù)和數(shù)字個數(shù)分別轉(zhuǎn)十進制輸出。

2.3程序清單:
DATA SEGMENT
pkey DB 0dh,0ah,"input string,the end flag is $"
skey DB 0dh,0ah,'abc length is:','$'
tkey DB 0dh,0ah,'num length is:','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX ;數(shù)據(jù)段堆棧段初始化
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能調(diào)用,輸出字符串
MOV DX,'$'
MOV AH,2
INT 21H ;DOS功能調(diào)用,輸出$
MOV DX,3AH
MOV AH,2
INT 21H ;DOS功能調(diào)用,輸出:
MOV DX,0DH
MOV AH,2
INT 21H ;DOS功能調(diào)用,歸位
MOV DX,0AH
MOV AH,2
INT 21H ;DOS功能調(diào)用,換行
MOV SI,0
MOV DI,0 ;清零,SI存放字母個數(shù),DI存放數(shù)字個數(shù)
INPUT: MOV AH,1
INT 21H
CMP AL,'$'
JZ INEND
CMP AL,'z'
JA INPUT
CMP AL,'a'
JAE ABC1 ;輸入為a~f,SI加1
CMP AL,'Z'
JA INPUT
CMP AL,'A'
JAE ABC1 ;輸入為A~F,SI也加1
CMP AL,'9'
JA INPUT
CMP AL,'0'
JAE NUM1 ;輸入為0~9,DI加1
JMP INPUT
ABC1: INC SI
JMP INPUT
NUM1: INC DI
JMP INPUT
INEND: MOV BX,0
MOV CX,10
MOV AX,SI ;將字母個數(shù)給AX(十六進制轉(zhuǎn)十進制)
LP1: MOV DX,0
DIV CX ;AX表示的32位數(shù)除以10,商放在AX,余數(shù)放在DX
PUSH DX ;將余數(shù)壓入棧
INC BX
CMP AX,0 ;商不為0就繼續(xù)除10
JNZ LP1
LEA DX,skey
MOV AH,9
INT 21H ;DOS功能調(diào)用,輸出字符串
LLP1: POP DX ;DX中數(shù)據(jù)依次出棧并顯示
ADD DX,30H
MOV AH,2
INT 21H ;DOS功能調(diào)用,輸出字母個數(shù)
DEC BX
JNZ LLP1
MOV BX,0
MOV AX,DI ;將數(shù)字個數(shù)給AX(十六進制轉(zhuǎn)十進制)
LP2:
MOV DX,0
DIV CX ;AX表示的32位數(shù)除以10,商放在AX,余數(shù)放在DX
PUSH DX ;將余數(shù)壓入棧
INC BX
CMP AX,0
JNZ LP2 ;商不為0就繼續(xù)除10
LEA DX,tkey
MOV AH,9
INT 21H ;DOS功能調(diào)用,輸出字符串
LLP2: POP DX ;DX中數(shù)據(jù)依次出棧并顯示
ADD DX,30H
MOV AH,2
INT 21H ;DOS功能調(diào)用,輸出數(shù)字個數(shù)
DEC BX
JNZ LLP2
JMP START
CODE ENDS
END START
2.4程序運行結果及分析:
當輸入字母或數(shù)字個數(shù)大于10之后統(tǒng)計輸出比較麻煩,這里使用了除以10循環(huán)并存入堆棧再依次輸出的方法實現(xiàn)輸出。

圖8 字符串輸入及顯示設計結果
到此這篇關于匯編語言系列之匯編實現(xiàn)字符串操作的文章就介紹到這了,更多相關匯編字符串操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
匯編語言 輸入10個數(shù)排序并輸出的實現(xiàn)
這篇文章主要介紹了匯編語言 輸入10個數(shù)排序并輸出的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
淺析ELF轉(zhuǎn)二進制允許把 Binary 文件加載到任意位置
本文通過 eip + 偏移地址 實現(xiàn)了運行時計算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2020-02-02

