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...