移動端適配的兩種方案及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 movdi, 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)題中的最後一條偽指令“end start”改為“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中的資料,經檢驗得證成功。