南京郵電大學匯編——實驗二:用戶登陸驗證程式的設計
- 兩個題目
- 源代碼
- 第一題的源代碼
- 第二題的源代碼
- 運行結果
兩個題目
- 從BUF單元開始存有一字串(長度<255),編程實作統計該字串中的ASCII在42H~45H之間的字符個數,并將統計結果以二進制形式顯示在螢屏,
- 程式執行后,給出提示操作,請用戶鍵入用戶名和密碼;用戶在鍵入密碼時,程式不回顯鍵入字符;只有當用戶鍵入的用戶名,密碼字串和程式內定的字串相同時,顯示歡迎界面并回傳DOS;否則給出提示資訊,用戶名或密碼錯誤,再次輸入,界面顏色自定(彩色或黑白)
源代碼
本來是想用rdrand指令來寫一段亂數生成代碼的,但是發現rdrand這個指令是在Inter于Ivy Bridge微架構(2012年生產)后才定義到IA32架構中的,目前我們的電腦上基本上都支持這個指令,但是經過嘗試之后發現即使采用直接寫位元組碼dosbox也不支持這個指令,可能有以下兩個原因:
- DosBox的虛擬化環境采用了模擬而不是虛擬,這導致了只支持實模式下的指令集;
- 這個指令只能在保護模式下使用
第一題的源代碼
.586P
data segment use16
Count_Number db 0
String_1 db 'ABCDEFG',0
data ends
Code segment USE16
ASSUME CS: CODE, DS: DATA
BEG:
mov ax,data
mov ds,ax
mov di,offset String_1
;得到在范圍內的數
Get_Count:
mov al,ds:[di]
cmp al,0
jz Print_Result
cmp al,42h
jb .1
cmp al,45h
ja .1
inc Count_Number
.1:
inc di
jmp Get_Count
;得到在范圍內的數
;列印資料
Print_Result:
mov bl,Count_Number
mov cx,8
.2:
mov dl,0
shl bl,1
adc dl,30h
mov ah,2
int 21h
loop .2
mov dl,'h'
int 21h
;列印資料
mov ah,4ch
int 21h
code ends
end BEG
第二題的源代碼
.586P
data segment use16
;定義資料接受區
UserName db 100 dup(0)
UserName_Recived_Number dw 0
Password db 100 dup(0)
Password_Recived_Number dw 0
;定義資料接受區
UserName_Origin db 'YourUserName',0
Password_Origin db 'YourPassword',0
String_Tip db 'Please enter your username!',0ah,0dh,'$'
String_Password_Tip db 'Please enter your password!',0ah,0dh,'$'
String_Wrong_Tip db 'Wrong username or password!\n',0ah,0dh,'$'
String_Hello_Tip db 'You got it!',0ah,0dh,'$'
data ends
Code segment USE16
ASSUME CS: CODE, DS: DATA
BEG:
mov ax,data
mov ds,ax
mov dx,offset String_Tip
mov ah,9
int 21h
mov UserName_Recived_Number,0
GetUserName:
mov ah,1
int 21h
mov di,offset UserName
add di,UserName_Recived_Number
mov ds:[di],al
inc UserName_Recived_Number
cmp al,0dh;當輸入回車時實際上是輸入了0x0a,0x0d兩個字符,此時系統呼叫實際上回傳的是最后一個字符0x0d
jnz GetUserName
mov di,offset UserName
add di,UserName_Recived_Number
sub di,1
mov [di],0
mov dx,offset String_Password_Tip
mov ah,9
int 21h
mov Password_Recived_Number,0
GetPassword:
mov ah,8
int 21h
mov di,offset Password
add di,Password_Recived_Number
mov ds:[di],al
inc Password_Recived_Number
cmp al,0dh;當輸入回車時實際上是輸入了0x0a,0x0d兩個字符,此時系統呼叫實際上回傳的是最后一個字符0x0d
jnz GetPassword
mov di,offset Password
add di,Password_Recived_Number
sub di,1;將最后一個輸入的0x0d字符刪去
mov [di],0
cld;當df位為0時,采用大端方式
mov ax,ds
mov es,ax
CheckUserName:
mov si,offset UserName_Origin
mov di,offset UserName
mov cx,UserName_Recived_Number
REPE cmpsb;采用串比較,源地址為ds:si,目的地址為es:di
jnz Wrong
CheckPassword:
mov si,offset Password_Origin
mov di,offset Password
mov cx,Password_Recived_Number
REPE cmpsb
jnz Wrong
mov dx,offset String_Hello_Tip
mov ah,9
int 21h
mov ah,4ch
int 21h
Wrong:
mov dx,offset String_Wrong_Tip
mov ah,9
int 21h
jmp BEG
code ends
end BEG
實際上這兩個題目都比較簡單,實際上撰寫的時候只需要注意一下系統呼叫之后的引數改變就好了,
其中第二個源代碼由于比較懶…有以下缺陷:
- 并沒有判斷輸入字符的個數,而是以回車作為結束回圈條件,所以存在緩沖區溢位;
- 并沒有考慮結束條件,這意味著如果不能輸入正確的用戶名和秘密將不能回傳DOS系統
運行結果
第一個題目:

第二個題目:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/187670.html
標籤:其他
上一篇:小米面經
下一篇:并發一(基本概念及理論準備)
