laravel unique驗證、確認密碼confirmed驗證以及密碼修改驗證的方法
目錄
實驗內容
實驗任務1
使用任意文字編輯器,錄入彙編源程式task1.asm。
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 5 dup(2) 5 data ends 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov ax, 0b800H 11 mov es, ax 12 mov cx, 5 13 mov si, 0 14 mov di, 0f00h 15 s: mov al, [si] 16 and al, 0dfh //and命令,是邏輯與,將al與0dfh,即為1101 1111進行按位與操作。17 mov es:[di], al 18 mov al, [5+si] 19 mov es:[di+1], al 20 inc si 21 add di, 2 22 loop s 23 mov ah, 4ch 24 int 21h 25 code ends 26 end start
使用-g命令執行程式,得到下圖
出現了綠色的NUIST字樣。
將line4中的五個位元組,重新彙編,連線。
1 db 5 dup(2) 2 --> 改成: 3 db 2,3,4,5,6
執行過後得到如下圖:
可以發現,綠色的NUIST變成了彩色,可以得到猜測,dup(2)控制的是字型的顏色。
實驗任務2
已知資料段data 中定義位元組資料如下:
1 data segments 2 db 23, 50, 66, 71, 35 3 data ends
編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。
設計程式碼:
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s1: mov ah,0 mov al,ds:[di] mov bl,10 div bl //拆分字串 mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h //輸出字元 mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h //輸出字元 mov ah,2 mov dl," " int 21h //輸出空格 inc di loop s1 mov ax,4c00h int 21h code ends end start
經過彙編,連線得到exe檔案,執行可以得到:
可以看到,首先使用div指令拆分字串,隨後利用地址以及int 21h命令將其輸出。
實驗任務3
教材「實驗5 編寫、除錯具有多個段的程式」(1)
程式原始碼task3.asm:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
經過彙編、連線得到task3.exe可執行檔案,反彙編
得到程式碼:
1.檢視dw中的元素:
使用 -g 1d命令執行程式,到列印之前,得到暫存器內容如下:
2.可發現,CS = 076CH,SS = 076BH, DS = 076AH
3.設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
實驗任務4
實驗原始碼task4.asm:
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h 4 data ends 5 6 stack segment 7 dw 0, 0 8 stack ends 9 10 code segment 11 start: mov ax,stack 12 mov ss, ax 13 mov sp,16 14 15 mov ax, data 16 mov ds, ax 17 18 push ds:[0] 19 push ds:[2] 20 pop ds:[2] 21 pop ds:[0] 22 23 mov ax,4c00h 24 int 21h 25 26 code ends 27 end start
經過彙編、連線後得到task4.exe可執行檔案,進行反彙編
檢視data中的資料:
發現其中資料為:1023H,0456H, 0000H, 0000H,0000H, 0000H,0000H, 0000H。
使用 -g 1d執行程式,得到 CS=076CH,SS=076BH,DS=076AH
檢視DS中的資料發現沒有改變。
因此:
1.CPU執行程式,程式返回前,data段中的資料:0123h, 0456h, 0, 0, 0, 0, 0, 0
2.CPU執行程式,程式返回前,cs=076ch,ss=076bh,ds=076ah
3.設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
4.對如下定義的段:
name segment
···
name ends
如果段中的資料佔 N 個位元組,不是16位元組的整數倍,則會補整,則程式載入後,
該段實際佔用的空間為:ceil(N+15)/16)*16,ceil()表示向上取整
實驗任務5
教材「實驗5 編寫、除錯具有多個段的程式」(3) 程式原始碼見task5.asm。assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
反彙編得到程式碼如下:
執行到076A:000D之前:
檢視資料段中的資料:
可以發現數據如下:0123H, 0456H, 0000H, 0000H, 0000H, 0000H, 0000H, 0000H.
執行命令,得到CS=076AH,SS=076EH,DS=076DH
在檢視資料段中的內容,發現並沒有變化:
由上可知,
1.CPU執行程式,程式返回前,data段中的資料:0123h, 0456h, 0, 0, 0, 0, 0, 0
2.CPU執行程式,程式返回前,cs=076ah,ss=076Eh,ds=076dh
3.設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X-4。
實驗任務6
只有教材中實驗5的3 的程式能夠正常執行。因為如果將 end start 改為 end,那麼不指明入口,會預設從 076A:0 開始執行,
前兩個的076A:0開始的地址存放的都是資料而不是指令,因此會報錯
第三個是先儲存的指令隨後儲存的資料,因而可以執行。
實驗任務7
程式原始碼見task7.asm:assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov si,0 mov cx,9 s: mov ax,0 mov al,[si] add al,[si+16] mov [si+32],al inc si loop s mov ah,4ch int 21h code ends end start
經過彙編,連線得到task7.exe可執行檔案。
因為a,b,c段的長度都是16,所以就直接通過加偏移量16 32來進行訪問
使用-g 19執行,檢視a,b,c的資料,看到最後一行的資料是由前面兩行相加得到的,滿足要求。
實驗任務8
原始碼見task8.asm:
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov si,0 mov cx,9 s: push ds:[si] add si,2 loop s mov ah,4ch int 21h code ends end start
反彙編後
可以發現,程式碼在001AH處呼叫int 21,使用
-g 001A命令執行程式。
從上圖中檢視的結果看出結果滿足實驗要求,實現了逆序儲存。