1. 程式人生 > 實用技巧 >一種樹形揹包的時間複雜度證明

一種樹形揹包的時間複雜度證明

一、實驗一

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
+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
閱讀源程式,從理論上分析原始碼的功能,尤其是line15-25,迴圈實現的功能是什麼,逐行理解每條指 令的功能。
    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
    db 
23,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.asm
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

        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