一種樹形揹包的時間複雜度證明
一、實驗一
1.ex1
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di閱讀源程式,從理論上分析原始碼的功能,尤其是line15-25,迴圈實現的功能是什麼,逐行理解每條指 令的功能。+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
mov cx, 5 定義步長為5,5次迴圈 mov si, 0 初始化 si mov di, 0f00h 附加段下標,為顯示區域 s: mov al, [si] 取資料段內對應字元 and al, 0dfh 小寫改為大寫 mov es:[di], al mov al, [5+si] mov es:[di+1], al 顏色資料 inc si add di, 2 loop s 迴圈執行
2.使用masm、link對ex1.asm進行彙編、連結,得到可執行檔案ex1.exe,執行並觀察結果。
3.使用debug工具對程式進行除錯,執行到程式返回前,即line27之前,觀察結果。
4.修改line4裡5個位元組單元的值,重新彙編、連結、執行,觀察結果。
db 5 dup(2) --> 改成: db 2,3,4,5,6
基於觀察,分析、猜測這裡的數值作用是什麼。
答:存放資料顏色資訊
二、實驗二
已知資料段data中定義位元組資料如下: data segments db 23, 50, 66, 71, 35 data ends 編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。assume cs:code, ds:data data segment db23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov dh,0ah mov di,0 mov cx,5 s: mov al,[di] mov ah,00h div dh add al,30h add ah,30h mov bx,ax inc di mov ah,2 mov dl,bl int 21h mov dl,bh int 21h mov dl,20h int 21h loop s mov ah,4ch int 21h code ends end start
三、實驗三
ex3.asmassume 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
使用masm、link對ex3.asm進行彙編、連結
1.程式返回前,data 段中的資料是多少?
答:230156048907 bc0a ef0d ed0f ba0c8709
2.程式返回前,cs=076C,ss=076B,ds=076A
3. 設程式載入後,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
1.CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04
2.CPU執行程式,程式返回前,cs=076C,ss=076B,ds=076A
3.設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
4. 對於定義如下的段:
name segment
…
name ends
如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為:⌈16N⌉×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
1.CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04
2.CPU執行程式,程式返回前,cs=076A,ss=076E,ds=076D
3. 設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4
六、實驗六
如果將“end start ”改為“end”(也就是說不指明程式入口),則哪些程式仍可以被正確執行?
答:不指明程式入口,那麼程式會直接從最開始執行,所以只有ex5可以正常執行
七、實驗七
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 c1 segment db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov si,0 mov cx,8 s: mov ax,[si] add ax,[16+si] mov [32+si],ax inc si loop s mov ah, 4ch int 21h code ends end start
八、實驗八
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,a mov ds,ax mov ax,b mov ss,ax mov sp,16 mov bx,0 s: push ds:[bx] add bx,2 loop s mov ah, 4ch int 21h code ends end start