彙編實驗五 編寫、除錯具有多個段的程式
一、練習一
程式碼如下:
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 pushds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
①CPU執行程式,程式返回前,data段中的資料為:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
②CPU執行程式,程式返回前,cs=076ch、ss=0769h、ds=075ah
③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
二、練習二
實驗程式碼如下:
assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h data ends stack segment dw 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
①CPU執行程式,程式返回前,data段中的資料為:0123h,0456h
②CPU執行程式,程式返回前,cs=076ch、ss=0769h、ds=075ah
③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
④對於如下定義的段:
name segment
...
name ends
如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為[(N+15)/16]*16
解題思路:開闢棧空間時以16個位元組為單位,所以棧的大小為16位元組的整數倍。
三、練習三
實驗程式碼如下:
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
①CPU執行程式,程式返回前,data段中的資料為:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
②CPU執行程式,程式返回前,cs=076ch、ss=0769h、ds=075ah
③設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4
四、練習四
將最後一條偽指令end start改為end後練習一、二不能正確執行,練習三可以。
因為將end start用於指明程式的入口,由其指明的入口在編譯、連線後被轉化為一個入口地址,程式由該地址開始執行。
刪去start後程序預設從第一個段開始執行,而只有練習三的程式碼段為第一個段,所以只有練習三可以正確執行。
五、練習五
編寫code中的程式碼將a段和b段中的資料依次相加,將結果存到c段中
實驗程式碼如下:
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 bx,0 mov cx,8 s: mov al,[bx] add al,[bx+10h] mov [bx+20h],al inc bx loop s mov ax,4c00h int 21h code ends end start
① 在實現資料相加前,邏輯段c 的8 個位元組:
② 執行完實現加運算的程式碼後,邏輯段c 的8 個位元組
經驗證,已正確實現資料相加。
六、實驗六
編寫code段中的程式碼,用push指令將a段中的前八個字型資料,逆序儲存到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 ss,ax mov sp,16 mov cx,8 mov bx,0 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
① 在push 操作執行前,檢視邏輯段b 的8 個字單元資訊截圖
② 執行push 操作,然後再次檢視邏輯段b 的8 個字單元資訊截圖
經驗證,已成功實現逆序儲存。
思考與總結:
這次實驗使我更深一步的瞭解了計算機內部執行程式時各指標的變化。本章內容雖然不多,但實際操作起來還是比較繁瑣的。