centos7.2搭建nginx的web伺服器部署uniapp專案
四、實驗結論
1.實驗任務1
原始碼如下:
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, 4chint 21h code ends end start
首先對task1.asm進行彙編連線:
直接執行觀察到螢幕左下角出現NUIST綠色字元:
然後對生成的task1.exe進行debug,首先進行反彙編,然後根據反彙編執行到movah,4c前
將程式line4的資料進行修改如下:
重新進行彙編連結執行結果如下:
可以猜測line4中的資料時用於控制對應字元的顏色,並且2對應的是綠色,因此由本來的陣列資料全2改成2,3,4,5,6時就只有字元N為綠色
2.實驗任務2
原始碼如下:
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 cx,5 mov si,0 s: mov ax,0 mov al,[si] mov bl,10 div bl add al,30h add ah,30h mov [si+5],al mov [si+6],ah //將對應字元資料存於原資料段後 mov ah,2 mov dl, [si+5] int 21h mov ah,2 mov dl, [si+6] int 21h mov ah,2 mov dl, 32 int 21h inc si loop s mov ah,4chint 21h code end end start
執行截圖如下:
3.實驗任務3
原始碼task.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
對程式進行debug截圖如下:
回答:
①由d命令可以觀察到資料段資料無變化
②cpu執行程式,程式返回前,cs=076cH,ss=076bH,ds=076aH
③設程式載入後,code段地址為X,則data段地址為X-2,stack段地址為X-1
4.實驗任務4
原始碼task4.asm如下:
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
對彙編連結好的task4.exe進行debug截圖如下:
答:①cpu執行程式,程式返回前,data段中的資料為多少?
與原資料不變
②cpu執行程式,程式返回前,cs=076ch,ss=076bh,ds=076ah。
③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
④如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為(N/16+1)*16取整。
5.實驗任務5
task5.asm原始碼如下:
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
對彙編連結後生成的task5.exe進行debug截圖如下:
答:①由d命令可以觀察到資料段資料為0123h和0456h
②cpu執行程式,程式返回前,cs=076aH ss=076eH ds=076dH
③設程式載入後,code段的段地址為x,則data段的段地址為x+3,stack段的段地址為x+4
6.實驗任務6
如果將實驗任務3,4,5中的最後一條偽指令“endstart”改為“end”(也就是說,不指明程式的入口),則哪個仍然可以正確執行?請說明原因。
實驗任務3修改後Debug:
以上為u 0 42的結果,可以發現修改前反彙編是從程式碼段開始,而修改後從ip:0即資料段開始進入,然後進行g命令執行若按照本來的g d則執行不完應該執行的程式碼,必須執行到40才能執行完本來的程式碼段,並且有可能因為執行資料段無關程式碼而發生錯誤:
實驗任務4修改後debug,進行反彙編:
與實驗任務3一樣,是從資料段開始,不能用原來的命令通過g命令正常執行;
實驗任務5修改後debug,進行反彙編如下:
使用g命令執行:
可以看見其正常執行,因為其程式碼段位於其他段前,所以無論有沒有表明程式碼段入口都不影響。
7.實驗任務7
task7.asm原始碼如下:
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 ; 在整合軟體環境中,請將此處的段名稱由c→改為c1或其它名稱 db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov si,0 mov cx,8 s: mov ax,0 mov al,[si] add al,[si+16] mov es:[si],al inc si loop s mov ax,4c00h int 21H code ends end start
使用debug執行截圖如下:
u命令進行反彙編:
g命令執行:
d命令檢視c資料段內容發現執行成功
8.實驗任務8
task8.asm程式碼如下:
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 cx,8 mov si,0 mov sp,0010h s: push [si] add si,2 loop s mov ax,4c00h int 21h code ends end start
debug執行截圖如下:
d命令檢視成功逆序存入