《組合語言》實驗五課程
實驗1
將下面的程式編譯連結, 用Debug載入、跟蹤,然後回答問題
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 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
(1)CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
(2)CPU執行程式,程式返回前,cs=076C、ss=076B、ds=076A。
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
實驗2
將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。
(1)CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU執行程式,程式返回前,cs=076C、ss=076B、ds=076A。
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
(4)對於如下定義的段:
name segment
…
name ends
如果段中的資料佔N個位元組,則程式載入後,該段實際佔用的空間為(N/16+1)*16。
實驗3
將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。
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
(1)CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU執行程式,程式返回前,cs=076A、ss=076E、ds=076D。
(3)設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4。
實驗4
如果將(1)、(2)、(3)題中的最後一條偽指令“end start”改為“end”(也就是說,不知名程式的入口),則哪個程式仍然可以正確執行?請說明原因
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 0,0,0,0,0,0,0,0 c ends ; code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov bx,0 mov cx,8 s1: mov al,ds:[bx] mov es:[bx],al inc bx loop s1 mov ax,b mov ds,ax mov bx,0 mov cx,8 s2: mov al,ds:[bx] add es:[bx],al inc bx loop s2 mov ax,4c00h int 21h code ends end start
實驗一
實驗二
實驗三
經過比較發現:實驗1、2不能正確執行,實驗3仍然可以正確執行。
原因:end start變成end,說明不指明程式入口,程式預設從IP=0處執行;實驗3是程式碼段在前,而實驗1、2是程式碼段在後,說明實驗3中IP=0時就可以執行程式碼段的內容。所以實驗3仍可以正確執行。
實驗5
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 0,0,0,0,0,0,0,0 c ends ; code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov bx,0 mov cx,8 s1: mov al,ds:[bx] mov es:[bx],al inc bx loop s1 mov ax,b mov ds,ax mov bx,0 mov cx,8 s2: mov al,ds:[bx] add es:[bx],al inc bx loop s2 mov ax,4c00h int 21h code ends end start
① 在實現資料相加前,邏輯段 c 的 8 個位元組:00 00 00 00 00 00 00 00
② 執行完實現加運算的程式碼後,邏輯段 c 的 8 個位元組:02 04 06 08 0A 0C 0E 10
3.根據①和②的除錯,實驗程式正確實現資料相加
實驗6
程式如下,編寫code段中的程式碼,用push指令將a段中的前8個字型資料,逆序儲存到b段中
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 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,a mov ds,ax mov ax,b mov bx,0 mov ss,ax mov sp,16 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start