pytorch機器學習小技巧總結
阿新 • • 發佈:2020-12-16
一、實驗目的
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暫存器中,