1. 程式人生 > 實用技巧 >移動端適配的兩種方案及flexible和px2rem-loader在webpack下的配置

移動端適配的兩種方案及flexible和px2rem-loader在webpack下的配置

1. 實驗任務1

使用任意文字編輯器,錄入彙編源程式task1.asm。原始碼如下:

 1 assume cs:code, ds:data 
 2 data segment 
 3     db 'Nuist' 
 4     db 5 dup(2) 
 5 data ends 
 6 
 7 code segment 
 8 start: 
 9     mov ax, data 
10     mov ds, ax 
11 
12     mov ax, 0b800H 
13     mov es, ax 
14 
15     mov cx, 5 
16     mov si, 0 
17     mov
di, 0f00h 18 s: mov al, [si] 19 and al, 0dfh 20 mov es:[di], al 21 mov al, [5+si] 22 mov es:[di+1], al 23 inc si 24 add di, 2 25 loop s 26 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start

使用masm、link對task1.asm進行彙編、連結,得到可執行檔案task1.exe,執行並觀察結果。

從以下的截圖中可以觀察到,實驗結果為綠色的NUSIT字樣。

在debug裡除錯到程式返回前,即line27之前

使用u命令將偏移地址為0~2ah範圍內的程式碼進行反彙編,找到CS:IP對應的指令為line27對應的mov ah, 4ch處,然後使用g命令除錯。

修改line4裡5個位元組單元的值

1 db 5 dup(2)
2  --> 改成: 
3 db 2,3,4,5,6
重新彙編、連結、執行,得到如下所示的結果,“UIST”的顏色均發生變化,“N”仍為綠色。

分析原始碼中data段line4的位元組資料的用途是?

根據修改前後呈現結果的對比,第二次有四個字元顏色有所改變,故line4的位元組資料應是用以控制字元顏色的。

2. 實驗任務2

已知資料段data中定義位元組資料如下:

1 data segments 
2     db 23, 50, 66, 71, 35 
3 data ends

編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。

結合提示,編寫程式如下:

 1 assume cs:code, ds:data
 2 data segment
 3         db 23, 50, 66, 71, 35
 4 data ends
 5 
 6 code segment
 7 start:
 8         mov ax, data
 9         mov ds, ax
10         mov cx, 5
11         mov si, 0
12 
13 s:      mov ah,0;
14         mov al, [si];
15         mov bl, 10;
16         div bl; //利用除法指令div,計算出每個數位上的數值
17 
18         mov dx, ax;
19         add dx, 3030h; //利用數值和數字字元之間ascⅡ碼的關係,把數值→數字字元
20 
21         mov ah,2;
22         int 21h; //利用系統功能呼叫int 21h中的2號子功能,輸出單個字元
23         mov ah,2;
24         mov dl,dh;
25         int 21h;
26 
27         mov dl,' '
28         int 21h
29 
30         inc si;
31         loop s;
32 
33         mov ah, 4ch
34         int 21h
35 code ends
36 end start

執行結果如下,指定的5個兩位數均成功列印輸出到螢幕上。

3. 實驗任務3

將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

(1)附上原始碼檔案task3.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0, 0, 0, 0, 0, 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

(2)回答教材中①②③三個問題。

① CPU執行程式,程式返回前,data段中的資料為

data段中的資料仍為0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h。  

② CPU執行程式,程式返回前,cs=076CH、ss=076BH、ds=076AH。 

③ 設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1

(3)附上回答①時,反彙編檢視data段中資料的截圖。驗證觀察到的結果和理論分析是否一致。

使用d命令檢視data段中的資料,證實實驗結果與理論分析一致。

(4)附上回答②時反彙編除錯截圖,即:在debug中,執行到程式返回前的除錯截圖。

4. 實驗任務4

將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

(1)附上原始碼檔案task4.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

(2)回答教材中①②③④三個問題。

① CPU執行程式,程式返回前,data段中的資料為多少? 

data段中的資料仍為0123h 0456h

② CPU執行程式,程式返回前,cs =076CH、ss =076BH、ds =076AH

③ 設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1

④對於如下定義的段: 

  name segment

  …

  name ends 

如果段中的資料佔N個位元組,則程式載入後,這段實際佔有的空間為(N/16+1)*16。(N/16向下取整)

8086處理器的內部定址原理和彙編程式編譯器共同決定了segment定義的段必須放在按16的倍數對準的段地址邊界上,佔用的空間也是16的倍數.

此處有更為詳盡的解釋可供參考

(3)附上回答②時反彙編除錯截圖,即:在debug中,執行到程式返回前的除錯截圖。

5. 實驗任務5

將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

(1)附上原始碼檔案task5.asm

 1 assume cs:code, ds:data, ss:stack
 2 
 3 code segment
 4 start:  mov ax,stack
 5         mov ss, ax
 6         mov sp,16
 7         
 8         mov ax, data
 9         mov ds, ax
10         
11         push ds:[0]
12         push ds:[2]
13         pop ds:[2]
14         pop ds:[0]
15         
16         mov ax,4c00h
17         int 21h
18 
19 code ends
20 data segment
21   dw 0123h, 0456h
22 data ends
23 
24 stack segment
25   dw 0,0
26 stack ends
27 end start

(2)回答教材中①②③三個問題。

① CPU執行程式,程式返回前,data段中的資料為多少? 

data段中的資料仍為0123H,0456H

② CPU執行程式,程式返回前,cs =076AH、ss =076EH、ds =076DH

③ 設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4。 

(3)附上回答②時反彙編除錯截圖,即:在debug中,執行到程式返回前的除錯截圖。

6. 實驗任務6

如果將(1)、(2)、(3)題中的最後一條偽指令“endstart”改為“end(也就是說不指明程式的入口),則那個程式仍然可以正確執行?請說明原因。

以上三圖的反彙編結果與前三個實驗任務中的截圖作對比,可證明(1)、(2)不能正常執行,(3)仍然可以被正確執行。因為不指明程式的入口時,入口則預設為載入進記憶體的第一個單元。在(1)、(2)中,皆是資料先載入進記憶體,而(3)是程式碼段先載入進記憶體。

7. 實驗任務7

程式如下,編寫code段中的程式碼,將a段和b段中的資料依次相加,將結果存到c段中。

(1)附上原始碼檔案task7.asm

 1 assume cs:code
 2 a segment
 3   db 1,2,3,4,5,6,7,8
 4 a ends
 5 
 6 b segment
 7   db 1,2,3,4,5,6,7,8
 8 b ends
 9 
10 c segment   
11   db 8 dup(0)
12 c ends
13 
14 code segment
15 start:
16     mov ax,c       
17     mov ds,ax       
18     mov cx,8       
19     mov bx,0       
20     mov ax,a       
21     mov es,ax       
22     mov ax,b       
23     mov ss,ax    
24 s:     mov al,es:[bx]       
25     add al,ss:[bx]       
26     mov [bx],al       
27     inc bx       
28     loop s 
29 
30     mov ax,4c00h       
31     int 21h
32 
33 code ends
34 end start

(2)附上在debug環境中,執行到程式返回前,檢視邏輯段c的資料的截圖,以此驗證所編寫的程式正確實現了題目要求

使用u命令反彙編檢視,g命令執行到程式返回前。

d命令檢視邏輯段c中的資料,經檢驗得證成功。

8. 實驗任務8

程式如下,編寫code段中的程式碼,用push指令將a段中的前8個字型資料,逆序儲存到b段中。

(1)附上原始碼檔案task8.asm

 1 assume cs:code
 2 a segment
 3   dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 4 a ends
 5 
 6 b segment
 7   dw 8 dup(0)
 8 b ends
 9 
10 code segment
11 start:    
12     mov ax,a
13     mov ds,ax
14       mov ax,b
15       mov ss,ax
16       mov sp,16
17       mov cx,8
18       mov bx,0
19  s:    mov ax,[bx]
20       push ax
21       add bx,2
22       loop s
23   
24       mov ax,4c00h
25     int 21h
26 code ends
27 end start

(2)附上在debug環境中,執行到程式返回前,檢視邏輯段c的資料的截圖,以此驗證所編寫的程式正確實現了題目要求

使用u命令反彙編檢視,g命令執行到程式返回前。

d命令檢視邏輯段c中的資料,經檢驗得證成功。