實驗2 彙編源程式編寫與彙編、調試
- 2020 年 11 月 2 日
- 筆記
;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 byte ptr ds:[7],4 mov ah,4ch int 21h code ends end

debug調試:
• d命令查看程式段前綴PSP所佔的256個位元組。
• u命令反彙編
• g命令執行到程式退出執行之前
;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

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循環將值存入顯示記憶體。
(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
觀察後猜想:高位位元組存放的是顏色資訊,低位位元組是內容資訊。
必做:
; 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命令查看數據是否存入此段記憶體區域:
在確定複製多少位元組時,可以先隨意補全,用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處。發現複製成功。