1. 程式人生 > 其它 >Ubuntu18.04系統FastDFS+Nginx+fastdfs-nginx-module單機部署

Ubuntu18.04系統FastDFS+Nginx+fastdfs-nginx-module單機部署

實驗4 彙編應用程式設計和c語言程式反彙編分析

實驗任務1

程式設計:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm!'。

外循壞控制行數,內循壞修改視訊記憶體,bx暫存器控制顏色

程式碼如下:

assume cs:code,ds:data
data SEGMENT
	     db 'welcome to masm!'
	     db 2h,24h,71h        	;顏色
data ENDS
code SEGMENT
	start:
	      mov  ax,data
	      mov  ds,ax
	      mov  si,0
          
	      mov  ax,0b800h    	;視訊記憶體地址
	      mov  es,ax
	      mov  di,0720h     	;開始位置

	      mov  cx,3         	;外迴圈次數
	      mov  bx,0         	;控制顏色
	s0:   push cx           	;儲存現場
	      mov  cx,16        	;內循壞 16位元組
	      mov  si,0
	s:    
	      mov  al,ds:[si]   	;低位字元
	      mov  ah,ds:[bx+16]	;高位顏色
	      mov  es:[di],ax
	      inc  si
	      add  di,2
	      loop s

	      inc  bx           	;顏色地址偏移
	      pop  cx           	;恢復
	      add  di,128       	;下一行
	      loop s0

	      mov  ah,4ch
	      int  21h
    
code ENDS
END start

執行結果:

實驗任務2

編寫子程式printStr,實現以指定顏色在螢幕上輸出字串。呼叫它,完成字串輸出。

子程式printSar

  • 功能:以指定顏色在螢幕上(從螢幕左上角開始)輸出字串
  • 要求:字串以0結尾
  • 入口引數
    • 字串的起始地址—> ds: si (其中,字串所在段的段地址—> ds, 字串起始地址的偏移地址—> si
    • 字串顏色—> al
  • 出口引數:無

源程式:

assume cs:code, ds:data
data segment
	str  db 'try', 0
data ends

code segment
	start:   
	         mov  ax, data
	         mov  ds, ax

	         mov  si, offset str
	         mov  al, 2
	         call printStr

	         mov  ah, 4ch
	         int  21h

	printStr:
	         push bx
	         push cx
	         push si
	         push di			 
	         mov  bx, 0b800H
	         mov  es, bx
	         mov  di, 0
	s:       mov  cl, [si]
	         mov  ch, 0
	         jcxz over
	         mov  ch, al
	         mov  es:[di], cx
	         inc  si
	         add  di, 2
	         jmp  s

	over:    pop  di
	         pop  si
	         pop  cx
	         pop  bx
	         ret

code ends
end start

執行結果:

把line3改為: str db 'another try', 0

執行結果:

把line12改為:mov al, 4

執行結果:

  • line19-22, line36-39,這組對稱使用的push、pop,這樣用的目的是什麼?

將各暫存器的值壓棧,保護現場。子程式執行結束後,出棧恢復現場。

  • line30的功能是什麼 ?

將cx中字元和顏色相關值寫入視訊記憶體地址。

實驗任務3

閱讀原始碼,理解子程式num2str的彙編實現。

  • 子任務1
    對task3.asm進行彙編、連結,得到可執行程式後,在debug中使用u命令反彙編,使用g命令執行
    到line15(程式退出之前),使用d命令檢視資料段內容,觀察是否把轉換後的數字字串'1984'存放
    在資料段中str標號後面的單元。

反彙編:

除錯執行:

  • 子任務2
    對task3.asm原始碼進行修改、完善,把task2.asm中用於輸出以0結尾的字串的子程式加進來,
    實現對轉換後的字串進行輸出。
    預期輸入結果如下:

task3.asm:

assume cs:code, ds:data
data segment
	x    dw 1984
	str  db 16 dup(0)
data ends

code segment
	start:   
	         mov  ax, data
	         mov  ds, ax
	         mov  ax, x
	         mov  di, offset str
	         call num2str
	         mov  byte ptr  [di],0
	         mov  si, offset str
	         mov  al, 2
	         call printStr

	         mov  ah, 4ch
	         int  21h

	num2str: 
	         push ax
	         push bx
	         push cx
	         push dx
        
	         mov  cx, 0
	         mov  bl, 10
	s1:      
	         div  bl
	         inc  cx
	         mov  dl, ah
	         push dx
	         mov  ah, 0
	         cmp  al, 0
	         jne  s1
	s2:      
	         pop  dx
	         or   dl, 30h         	;ascii
	         mov  [di], dl
	         inc  di
	         loop s2
        
	         pop  dx
	         pop  cx
	         pop  bx
	         pop  ax

	         ret

	printStr:
	         push bx
	         push cx
	         push si
	         push di

	         mov  bx, 0b800H
	         mov  es, bx
	         mov  di, 0
	s:       mov  cl, [si]
	         mov  ch, 0
	         jcxz over
	         mov  ch, al
	         mov  es:[di], cx
	         inc  si
	         add  di, 2
	         jmp  s

	over:    pop  di
	         pop  si
	         pop  cx
	         pop  bx
	         ret
code ends
end start

執行結果:

實驗任務4

彙編、連結、執行程式,輸入一個字串並以#結束(比如,2020, bye#)觀察執行結果。結合執行結果,理解程式功能,瞭解軟中斷指令。具體地:

  • line12-19實現的功能是?

  • line21-27實現的功能是?

assume cs:code, ds:data
data segment
        str db 80 dup(?)
data ends

code segment
start:  
        mov ax, data
        mov ds, ax
        mov si, 0

s1:        
        mov ah, 1
        int 21h
        mov [si], al
        cmp al, '#'
        je next
        inc si
        jmp s1
next:
        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2

        mov ah, 4ch
        int 21h
code ends
end start

執行結果:

1.輸入字串:

2.以“#”結束

  • line12-19實現的功能是?

呼叫int 21h的1號子功能,從鍵盤輸入單個字元。若輸入為#號,則跳轉至標號next,否則繼續迴圈

  • line21-27實現的功能是?

1.cx表示字串的長度

2.呼叫int 21h的2號子功能,在螢幕上輸出單個字元

3.使用loop迴圈輸出cx次即字串長度的次數

實驗任務5

在visual studio整合環境中,編寫一個簡單的包含有函式呼叫的c程式。程式碼如下:

#include <stdio.h>
int sum(int, int);

int main() {
	int a = 2, b = 7, c;
    
	c = sum(a, b);
    
	return 0;
} 
int sum(int x, int y) {
	return (x + y);
}

line7設定斷點:

反彙編:

line13設定斷點:

反彙編:

分析反彙編程式碼,從彙編的角度,觀察高階語言中引數傳遞和返回值是通過什麼實現的,以及,引數入棧順序,返回值的帶回方式,等等。

反彙編分析:

1.引數從右向左,先將資料存入暫存器中,再入棧。

2.返回值通過eax暫存器帶回