1. 程式人生 > 其它 >pytorch機器學習小技巧總結

pytorch機器學習小技巧總結

一、實驗目的

1. 理解80×25彩色字元模式顯示原理 2. 理解轉移指令jmp, loop, jcxz的跳轉原理,掌握使用其實現分支和迴圈的用法 3. 理解轉移指令call, ret, retf的跳轉原理,掌握組合使用call和ret/retf編寫彙編子程式的方法,掌握 引數傳遞方式 4. 理解標誌暫存器的作用 5. 理解條件轉移指令je, jz, ja, jb, jg, jl等的跳轉原理,掌握組合使用匯編指令cmp和條件轉移指令實 現分支和迴圈的用法 6. 瞭解在visual studio/Xcode等環境或利用gcc命令列引數反彙編c語言程式的方法,理解編譯器生成 的反彙編程式碼 7. 綜合應用定址方式和彙編指令完成應用程式設計

二、實驗結論

1.實驗任務1

教材「實驗9 根據材料程式設計」(P187-189) 程式設計:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm!'。 源程式:
 1 assume cs:code
 2 data segment
 3     db 'welcome to masm!'
 4     db 02h,24h,71h  ; 要求的三個顏色對應的16進位制程式碼
 5 data ends
 6 stack segment
 7     db 16 dup(0)
 8 stack ends
 9 code segment
10 start:    
11         ;
設定data段,以及ds:bx指向data段的第一個單元, 12 ; 即ds:[bx]的內容就是data段第一個單元的內容 13 mov ax,data 14 mov ds,ax 15 16 mov ax,0b800h ;設定起始快取 17 mov es,ax 18 19 mov ax,stack 20 mov ss,ax 21 mov sp,10h ;指向棧頂 22 23 mov bx,780h ;
行 從12-14(注意:從第1行開始計數) 24 mov si,10h ; 顏色的偏移量,三次迴圈每次 25 ; 增加 1h 指向下一個顏色 26 27 mov cx,3 ; 三次迴圈改變行 28 s: mov ah,ds:[si] ;顏色事先存放在ah中 29 push cx 30 push si 31 32 mov cx,16 ; 16次迴圈改變列 33 mov si,64 34 mov di,0 35 36 s0: mov al,ds:[di] ;將date段中的字元一個一個傳入es中 37 mov es:[bx+si],al ; 低位存放字元 38 mov es:[bx+si+1],ah ; 高位存放顏色 39 40 add si,2 ;顯示快取區字元ASCII碼偏移量為2 41 add di,1 ;data段字元的偏移量,每次加 1 42 43 loop s0 44 45 pop si 46 pop cx ;後進先出,先出棧si,再出棧cx 47 48 add si,1h ;指向下一個顏色 49 add bx,0a0h ;指向下一行 160=0a0h 50 loop s 51 52 mov ax,4c00h 53 int 21h 54 code ends 55 end start

mov si,64 從64開始是因為:(1)字串為32位元組,16位元組ASCLL碼,16位元組屬性

(2)每一行有160列,那麼餘下有 160-32=128列為空白,要使得字串居中顯示,那麼字串的左邊

右邊,都應該是64位元組(128/2),而列數是從0開始計數,所以左邊的64位元組為0-63,所以這裡偏移量

為64。

彙編、連結、執行後實驗結果:

2.實驗任務2

編寫子程式printStr,實現以指定顏色在螢幕上輸出字串。呼叫它,完成字串輸出。 使用任意文字編輯器,錄入彙編源程式task2.asm。
 1 assume cs:code, ds:data
 2 data segment
 3     str db 'try', 0
 4 data ends
 5 
 6 code segment
 7 start:  
 8     mov ax, data
 9     mov ds, ax    
10 
11     mov si, offset str
12     mov al, 2
13     call printStr
14 
15     mov ah, 4ch
16     int 21h
17 
18 printStr:
19     push bx
20     push cx
21     push si
22     push di
23 
24     mov bx, 0b800H
25     mov es, bx
26     mov di, 0
27 s:      mov cl, [si]
28     mov ch, 0
29     jcxz over
30     mov ch, al
31     mov es:[di], cx
32     inc si
33     add di, 2
34     jmp s
35 
36 over:   pop di
37     pop si
38     pop cx
39     pop bx
40     ret
41 
42 code ends
43 end start

彙編、連結、執行程式,觀察執行結果:

對源程式做如下修改:

把line3改為:

str db 'another try', 0
把line12改為:
mov al, 4

再次彙編、執行程式,觀察執行結果:

基於執行結果,理解原始碼,以及,組合使用轉移指令call和ret實現子程式的原理與方法。具體地,在line18-40中:

line19-22, line36-39,這組對稱使用的push、pop,目的是保護和恢復各暫存器的值,可以更好的利用暫存器空間。

line30的功能是讀取目標資料存入es,將cx中存放的字元及其顏色屬性送入視訊記憶體中,實現在螢幕上的顯示。

3.實驗任務3

使用任意文字編輯器,錄入彙編源程式task3.asm。

子任務1

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

觀察發現成功把轉換後的數字字串‘1984’存放在資料段中str標號後面的單元。

子任務2

對task3.asm原始碼進行修改、完善,把task2.asm中用於輸出以0結尾的字串的子程式加進來, 實現對轉換後的字串進行輸出。 原始碼:
 1 assume cs:code, ds:data
 2 data segment
 3         x dw 1984
 4         str db 16 dup(0)
 5 data ends
 6 
 7 code segment
 8 start:  
 9         mov ax, data
10         mov ds, ax
11         mov ax, x
12         mov di, offset str
13         call num2str
14 
15         mov si, offset str
16         mov al, 2
17         call printStr
18 
19         mov ah, 4ch
20         int 21h
21 
22 num2str:
23         push ax
24         push bx
25         push cx
26         push dx
27         
28         mov cx, 0
29         mov bl, 10
30 s1:      
31         div bl
32         inc cx
33         mov dl, ah
34         push dx
35         mov ah, 0
36         cmp al, 0
37         jne s1
38 s2:        
39         pop dx
40         or dl, 30h
41         mov [di], dl
42         inc di
43         loop s2
44         
45         pop dx
46         pop cx
47         pop bx
48         pop ax
49 
50         ret
51 
52 printStr:
53     push bx
54     push cx
55     push si
56     push di
57 
58     mov bx, 0b800H
59     mov es, bx
60     mov di, 0
61 s:      mov cl, [si]
62     mov ch, 0
63     jcxz over
64     mov ch, al
65     mov es:[di], cx
66     inc si
67     add di, 2
68     jmp s
69 
70 over:   pop di
71     pop si
72     pop cx
73     pop bx
74     ret
75 
76 code ends
77 end start

把task3.asm原始碼中,line3中整數改成0~2559之間的任意數值,執行測試,觀察結果。

把line3中整數改為1314:

4.實驗任務4

使用任意文字編輯器,錄入彙編源程式task4.asm。
 1 assume cs:code, ds:data
 2 data segment
 3         str db 80 dup(?)
 4 data ends
 5 
 6 code segment
 7 start:  
 8         mov ax, data
 9         mov ds, ax
10         mov si, 0
11 
12 s1:        
13         mov ah, 1
14         int 21h
15         mov [si], al
16         cmp al, '#'
17         je next
18         inc si
19         jmp s1
20 next:
21         mov cx, si
22         mov si, 0
23 s2:     mov ah, 2
24         mov dl, [si]
25         int 21h
26         inc si
27         loop s2
28 
29         mov ah, 4ch
30         int 21h
31 code ends
32 end start

彙編、連結、執行程式,輸入一個字串並以#結束(比如,2020, bye#)觀察執行結果。

結合執行結果,理解程式功能,瞭解軟中斷指令。具體地: line12-19實現的功能是:通過中斷轉移指令和條件跳轉指令,從鍵盤中讀取字元存入指定記憶體單元,直到遇到'#'結束。 line21-27實現的功能是:通過迴圈指令,依次輸出儲存在棧內的字元。

5.實驗任務5

在visual studio整合環境中,編寫一個簡單的包含有函式呼叫的c程式。程式碼如下:
 1 #include <stdio.h>
 2 int sum(int, int);
 3 
 4 int main() {
 5     int a = 2, b = 7, c;
 6 
 7     c = sum(a, b);
 8 
 9     return 0;
10 }
11 
12 int sum(int x, int y) {
13     return (x + y);
14 }

在line7, line13分別設定斷點:

在除錯模式下,檢視反彙編程式碼:

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

高階語言中引數傳遞和返回值都是通過棧實現的,資料從ptr [a]、ptr [b]傳入eax、ecx等暫存器。 呼叫函式時,形參引數入棧自右向左。先借助暫存器,將引數b 的地址壓入堆疊暫存器eax,再將引數a 的值壓入堆棧暫存器ecx。 用call命令呼叫sum函式,最後返回真正的值為eax,再傳入雙字資料ptr[c],函式的返回值放在eax暫存器中,呼叫ret指令返回。