彙編實踐作業,字串匹配

2022-05-29 18:45:14 字數 4430 閱讀 1053

created on wed. jun 17 00:36:12 2020

@author: 姜志成

學號:2018633007

專業:電子與計算機工程

字串的處理是組合語言程式設計中乙個重要部分。字串操作一般包括資料塊移動、串排序、串搜尋、串比較、串複製、串插入、串刪除、串交換以及大小寫字母轉換等內容。編寫字串操作程式時經常會用到80x86串操作指令。

**模擬密碼輸入:假設資料庫中有密碼 5201314 ,使用者輸入乙個字串,顯示的時候全都以 * 出現,然後判斷使用者輸入的字串是否與資料庫中密碼相同,若相同,輸出 「 passwordright!」 ,否則輸出 「 password error!」 **

完成老師布置的基本功能,即檢查密碼是否正確,輸入密碼時顯示*

可以檢查使用者名稱是否輸入正確

如果覺得輸入的時候錯誤了,可以在輸入的時候用backspace進行刪除。因為正常輸入密碼的時候backspace也會讀入進去,所以要進行特判

msg1 db 'username:',0dh,0ah,'$' ; 指定使用者名稱存放的資料區

msg2 db 0dh,0ah,'password:',0dh,0ah,'$' ; 指定密碼的資料區

msg3 db 0dh,0ah,0dh,0ah,'password right!',0dh,0ah,'$' ; 密碼正確提示

msg4 db 0dh,0ah,0dh,0ah,'username error!',0dh,0ah,'$'; ;使用者名稱報錯

msg5 db 0dh,0ah,0dh,0ah,'password error!',0dh,0ah,'$'; ;密碼報錯

buf1 db '2018633007'

userlen equ $-buf1 ; 統計使用者名稱長度

buf2 db '5201314'

pwlen equ $-buf2 ; 統計密碼長度

buf3 db 15 ; 使用者輸入使用者名稱的資料區

db ?

db 15 dup(?)

buf4 db 15 dup(?) ; 使用者輸入密碼的資料區

data ends

stacks segment stack

dw 128 dup(?)

stacks ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov ah,9

mov dx,offset msg1 ; 顯示使用者名稱輸入介面

int 21h

mov ah,0ah

mov dx,offset buf3 ; 鍵入使用者名稱字串

int 21h

mov bx,offset buf1 ; 獲得儲存正確賬戶名的偏移位址

mov si,offset buf3+2 ; 獲得儲存輸入賬戶名的偏移位址

mov cx,userlen

cmpuser:

; 進行使用者名稱對比

mov al,[bx]

cmp [si],al ; 將輸入字串的對應位置與正確賬戶名進行比較

jnz error1 ; 當前位置和原本的使用者名稱不一樣就報錯

inc si

inc bx

loop cmpuser ; 重複進行直到字串結束

mov ah,9

mov dx,offset msg2 ;顯示密碼輸入介面

int 21h

mov cx,pwlen ; 讀入正確的密碼長度

mov si,offset buf4 ; 獲得儲存輸入密碼的偏移位址

getpw:

mov ah,7 ; 逐個字元輸入密碼,遇到回車結束輸入

int 21h

cmp al,0dh

jz next

cmp al,08h

je delete ; 覺得輸入錯誤,利用backspace鍵刪除

mov [si],al

mov ah,2 ; 在螢幕上顯示*

mov dx,'*'

int 21h

inc si

inc bx ; 統計輸入密碼的長度

loop getpw

delete:

; 想利用backspace鍵進行刪除

cmp bx, 00h ; 如果刪除到第0個位置,再刪除就直接退出

jz exit

dec bx

call delcode

mov ah,2 ; 呼叫2號中斷,顯示空格,消除星號

mov dl,' '

int 21h

mov byte ptr [si],00h

dec si

call delcode

jmp getpw

next:

mov cx,pwlen

mov bx,offset buf2

mov si,offset buf4

cmppw:

; 把輸入的密碼和正確的密碼進行對比

mov al,[bx]

cmp [si],al

jnz error2

inc si

inc bx

loop cmppw ;逐個字元比較buf2和buf4

mov ah,9

mov dx,offset msg3

int 21h

jmp exit

delcode proc

; 刪除乙個字元,即把游標向左移動一格

mov ah,3 ; 獲取游標位置

int 10h

mov ah,2 ;2號中斷:置游標位置

sub dl,1 ;列數減1,實現游標左移

int 10h

retdelcode endp

error1:

; 使用者名稱錯誤時報錯

mov dx,offset msg4

call dispmsg

error2:

; 密碼錯誤時報錯

mov dx,offset msg5

call dispmsg

dispmsg proc

;定義乙個過程,用於輸出字串

mov ah,9 ;呼叫9號子功能

int 21h ;返回dos

jmp exit

dispmsg endp

exit:

mov ah,4ch

int 21h

code ends

end start

本實驗要熟練掌握dos系統i/o功能呼叫

01h:鍵盤輸入並回顯單字元

02h:單字元顯示輸出

07h:鍵盤輸入無回顯

09h:顯示字串

0ah:字串輸入到緩衝區,等待讀入一串字元

雖然功能號01h與07h都是等待輸入乙個字元,但是他們的區別是07h沒有回顯,因此本實驗等待鍵入密碼應呼叫功能號07h。

在檢查輸入的使用者名稱和密碼是否正確時,採取的是逐個字元比較,若相同則繼續比較後乙個字元,不同則停止迴圈並報錯。

由於輸入密碼時,每輸入乙個字元,螢幕上應顯示乙個*,因此不宜以字串形式輸入密碼,應逐個輸入。

每輸入乙個字元,將其ascii碼和08h進行比較,若相等則捕獲當前游標的位置,然後刪除這個不想要的字元

每輸入乙個字元,將其ascii碼與0dh進行比較,目的是以回車鍵進行結束輸入

在呼叫子程式的時候可以通過暫存器dx,bx等來傳輸引數,並且有些時候可以通過段暫存器來過渡儲存資料

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...