su使用者身份切換與sudo提權
;ex1.asm assume cs:code code segment mov ax,0b810h mov ds,ax mov byte ptr ds:[0],1 mov byte ptr ds:[1],1 mov byte ptr ds:[2],2 mov byte ptr ds:[3],2 mov byte ptr ds:[4],3 mov byte ptr ds:[5],3 mov byte ptr ds:[6],4 mov要求:使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex1.asm進行彙編、連結、執行,使用debug工具除錯可執行檔案。 • 使用masm、link對ex1.asm進行彙編、連結,得到可執行檔案ex1.exe,執行並觀察結果。 •使用debug工具對程式進行除錯 •使用debug載入可執行檔案ex1.exe後,使用d命令檢視程式段字首PSP所佔的256個位元組。 •結合可執行檔案中暫存器CX的值,使用u命令對ex1.exe進行精確反彙編 •使用g命令執行到程式退出執行之前(即原始碼檔案中line16之前),觀察結果。byte ptr ds:[7],4 mov ah,4ch int 21h code ends end
debug除錯:
• d命令檢視程式段字首PSP所佔的256個位元組。
•u命令反彙編
•g命令執行到程式退出執行之前
2. 實驗任務2 使用任意一款文字編輯器,編寫8086彙編源程式ex2.asm。原始碼如下:;ex2.asm assume cs:code code segment mov ax,0b810h mov ds,ax mov bx,0 mov ax,101H mov cx,4 s: mov [bx],ax add bx,2 add ax,101H loop s mov ah,4ch int 21h code ends end要求:使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex2.asm進行彙編、連結、執行,使用debug工具除錯可執行檔案。 •使用masm、link對ex2.asm進行彙編、連結,得到可執行檔案ex2.exe,執行並觀察結果。 •使用debug工具對程式進行除錯。 •結合可執行檔案中暫存器CX的值,使用u命令對ex2.exe進行精確反彙編 •靈活使用t命令、p命令、g命令,對ex2.exe進行除錯。(不一定要單步,有些地方可以用g命令,一次執行多行彙編指令) •注意:單步除錯時,對於迴圈指令loop, 中斷指令int,使用t命令和p命令單步除錯的區別。 •把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,儲存後重新彙編、連結、執行並觀察結果。 • 結合上述實驗和觀察,分析、對比ex2.asm和ex1.asm,它們實現的是否是相同的功能和效果?在具體實現上有什麼不同
dubug除錯:
單步除錯迴圈指令loop:
單步除錯中斷指令int:
到loop、int時直接用P命令:
經觀察發現,t命令單步執行,每次只執行一條程式碼語句,遇到子程式後進入子程式逐條執行指令。p命令,類似t命令。若有子程式,直接執行完子程式全部指令而不是逐條執行指令,在遇到迴圈指令loop時,會直接執行志cx遞減至0。
ex2.asm中line9為mov cx, 4時:
改成 mov cx, 8 ,儲存後重新彙編、連結、執行:
ex2.asm和ex1.asm,它們實現的是否是相同的功能和效果?在具體實現上有什麼不同
通過上述實驗可知,他們實現的功能和效果相同,都完成了圖案的輸出。
具體實現上,ex1.asm使用了byte ptr的形式直接填入了8個數,而ex2.asm使用了loop迴圈將值存入視訊記憶體。
3. 實驗任務3 綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料0237H。 要求: • 編寫彙編源程式、給出執行結果截圖。 • 把填充的字資料,從0237H 改成0239H,再次儲存後,彙編、連結、執行,觀察結果。 • 把填充的字資料,從0237H 改成0437H,再次儲存後,彙編、連結、執行,觀察結果。 猜測並分析,這個字資料中高位位元組裡存放的是什麼資訊,低位位元組裡存放的是什麼資訊。(1)填充資料0237H
;ex2.asm assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov ax,0237H mov cx,10h s: mov [bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end
(2)填充資料0239H
(3)填充資料0437H
觀察後猜想:高位位元組存放的是顏色資訊,低位位元組是內容資訊。
4. 實驗任務4 編寫完整彙編源程式,實現向記憶體0:200~0:23F依次傳送資料0~63(3FH)。 ♦ 必做 •綜合使用[bx]和loop,編寫彙編源程式 •靈活使用debug的t命令、g命令、p命令除錯。在程式退出前,用d命令檢視0:200~0:23F,確認是否將0~3F傳送至此段記憶體區域。 ♦ 選做* •利用棧的特性,綜合使用loop,push實現(限定僅使用8086中已學過指令實現),編寫源程式 •靈活使用debug的t命令、g命令、p命令除錯。在程式退出前,用d命令檢視0:200~0:23F,確認是否將0~3F傳送至此段記憶體區域。 ♦ Tips: 這道練習,本質上就是把一組連續的位元組資料(常數),送到指定的連續的位元組單元。 如果利用棧實現,藉助push和loop實現連續入棧操作。需要注意: ① 初始時ss和sp的設定 ② 8086的入棧操作,是從高地址單元→低地址單元方向的; ③ 8086的入棧操作,只能以字為單元。但這裡是位元組資料,如何靈活處理?必做:
; ex4.asm assume cs:code code segment mov ax, 0h mov ds, ax mov bx, 200h mov al, 0h mov cx, 40H s: mov [bx], ax add bx, 1 add ax, 1 loop s mov ah, 4ch int 21h code ends end
除錯並用d命令檢視資料是否存入此段記憶體區域:
選做:
8086的入棧操作是從高地址向低地址,所以設定棧的段地址ss為0h,設定sp為0240h。又因8086入棧操作只能以字為單元。所以ax初始為3F3Eh,小端法棧裡新增。
;ex44.asm assume cs:code code segment mov ax,0h mov ss,ax mov ax,0240h mov sp,ax mov ax,3F3Eh mov cx,20h s: push ax add ax,-0202h loop s mov ah,4ch int 21h code ends end
除錯並用d命令檢視資料是否存入此段記憶體區域:
5. 實驗任務5 教材實驗4(3)(P121) ♦ Tips: 這道練習,本質仍然是複製,只不過複製的是自身程式碼。填空的關鍵是,如何確定複製多少位元組在確定複製多少位元組時,可以先隨意補全,用u命令精準反彙編,找到mov ax, 4c00h。來確定要複製的位元組數。
反彙編後可知 mov ax,4c00 命令位於0018h。所以要複製0-0017h所有位元組,因此將0017複製給cx。由暫存器cs知要複製的程式碼位於076A段,所以將076A賦值給AX。
assume cs:code code segment mov ax,076Ah mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0017h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
執行結果:
組合語言除錯完畢後,反彙編檢視記憶體單元 0:200-0:217處。發現複製成功。