Loading [MathJax]/extensions/TeX/AMSsymbols.js

2016年4月12日 星期二

[組合語言][masm]字串比對

題目:程式執行時先顯示「輸入密碼」,如果輸入「ncyu CSIE」就顯示「通過」,如果不是顯示「密碼不正確」,如果錯誤三次則顯示「不通過」

程式碼:



TITLE 程式執行時先顯示「輸入密碼」,如果輸入「ncyu CSIE」就顯示「通過」,如果不是顯示「密碼不正確」,如果錯誤三次則顯示「不通過」 (h401.asm)
INCLUDE Irvine32.inc
;INCLUDE 指令會從位於組譯器的INCLUDE目錄內的Irvine32.inc文字檔中,複製必要的定義與初始資訊
.data
;.data標記程式中含有變數的區域
Startstring BYTE "please key in the passwords: ",0
string_1 BYTE 21 DUP(0) ;輸入緩衝區
byteCount DWORD ? ;輸入字元計數器
tag DWORD 0t
string_2 BYTE "ncyu CSIE",0
msg1 BYTE "通過",0
msg2 BYTE "密碼不正確",0
msg3 BYTE "不通過",0
.code
;.code指引標記著程式碼區段起始的位置,所有可執行的敘述,都會放在程式碼區段內
main PROC
;PROC指引標記著程序的起始位置
mov ecx,3 ;ecx表示迴圈跑的次數
mov ebx,0t
L1:
lea edx,offset startstring ;將字串移至edx暫存器中
call WriteString ;顯示在edx暫存器中的字串
mov edx,OFFSET string_1 ;緩衝區的位移
mov ecx,SIZEOF string_1 ;指定所輸入字元的最大數量
call ReadString ;輸入字串
mov byteCount,eax ;存放所鍵入的字元數量
call compare_strings
mov eax,tag
cmp eax, 1
je L3
inc ebx
cmp ebx ,3t
je L2
loop L1
L2:
mov edx,OFFSET msg3
call WriteString
L3:
call Crlf
exit ;exit表示將(非直接)呼叫一個預先定義的MS-Windows函式,此函式的作用是停止此程式的執行
main ENDP;ENDP標記main程序的結束位置
compare_strings PROC
;比較string_1及string_2
INVOKE str_compare,ADDR string_1,ADDR string_2
.IF ZERO?
mov edx, OFFSET msg1
inc tag
.ELSE
mov edx, OFFSET msg2
.ENDIF
call WriteString
call Crlf
ret
compare_strings ENDP
END main;標記此程式啟動的程序
view raw 3.asm hosted with ❤ by GitHub

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。