1. 程式人生 > 實用技巧 >如何對Pandas DataFrame進行自定義排序

如何對Pandas DataFrame進行自定義排序

一、實驗目的

  1. 理解並掌握彙編源程式組成與結構

  2. 掌握組合語言源程式編寫→彙編→連結→除錯的工具和方法

  3. 理解彙編源程式中地址表示、段暫存器的用法

  4. 理解和掌握暫存器間接定址方式[bx]

  5. 通過彙編指令loop的使用理解程式語言中迴圈的本質

二、實驗準備

  1. 學習/複習第5章使用[bx]和loop實現迴圈的程式設計應用示例(教材5.5節,5.8節)

  2. 複習第3章「棧」的知識

  3. 結合第4章課件,複習完整彙編源程式編寫→彙編→連線→執行→除錯的方法

  4. 複習8086彙編中記憶體單元地址的表示,以及段暫存器DS, SS, ES, CS的用途

三、實驗步驟與結論

  1. 實驗任務1

    使用任意一款文字編輯器,編寫8086彙編源程式ex1.asm。原始碼如下:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6     mov byte ptr ds:[0], 1
 7     mov byte ptr ds:[1], 1
 8     mov byte ptr ds:[2], 2
 9     mov byte ptr ds:[3], 2
10     mov byte ptr ds:[4], 3
11     mov byte
ptr ds:[5], 3 12 mov byte ptr ds:[6], 4 13 mov byte ptr ds:[7], 4 14 mov ah, 4ch 15 int 21h 16 code ends 17 end

    編寫程式碼之後,對該檔案進行彙編,連結,執行,使用debug工具除錯可執行檔案,結果如下:

    

    

    

    使用d命令檢視程式段字首PSP所佔的256個位元組,得到結果如下:

    

    由CX暫存器的值可知,程式段的空間為 076A:0000~076A:0031,使用u命令進行精確反彙編:

    

    使用g命令執行到程式退出之前,結果如下:

    

  2. 實驗任務2

    使用任意一款文字編輯器,編寫8086彙編源程式ex2.asm。原始碼如下:

 1 ; ex2.asm
 2 assume cs:code
 3 code segment
 4         mov ax, 0b810h
 5         mov ds, ax
 6         mov bx, 0
 7         mov ax, 101H
 8         mov cx, 4
 9 s:     mov [bx], ax
10         add bx, 2
11         add ax, 101H
12         loop s
13         mov ah,4ch
14         int 21h
15 code ends
16 end

    使用masm、link對ex2.asm進行彙編、連結,得到可執行檔案ex2.exe,執行,結果如下:

    

    

    根據CX暫存器中的值,對ex2實行精確反彙編,得到結果如下:

    

    對ex2進行除錯,得到最終結果:

    

    將程式碼段中的mov cx,4改為mov cx,8之後,再次彙編,連結,執行並觀察結果:

    

    結論:可以發現實驗任務1和實驗任務2的程式碼實現了相同的功能,但是在具體實現上有所不同:

       實驗任務1採用的是直接定址的方式,對段空間進行寫入;

       實驗任務2採用的是間接定址的方式,並採用了迴圈結構對段空間進行寫入;

  3. 實驗任務3

    綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料 0237H。

    程式碼如下:

 1 assume cs:code
 2 code segment
 3             mov ax,0b800h
 4             mov ds,ax
 5             mov bx,07b8h
 6             mov cx,16
 7             mov ax,0237h
 8 s:         mov [bx],al
 9             inc bx
10             mov [bx],ah
11             inc bx
12             loop s
13             mov ax,4ch
14             int 21h
15             code ends
16 code

    彙編,連結,執行後,得到結果如下:

    

    把填充的字資料,從0237H 改成0239H,再次儲存後,彙編、連結、執行;

    

    把填充的字資料,從0237H 改成0437H,再次儲存後,彙編、連結、執行;

    

    分析與結論:

    通過上述實驗,發現將0237h改為0239h後,螢幕上的字元由"7"變為"9",由此可得出低位存放的是ascll碼值;

    將0237h改為0437h後,螢幕上的字元顏色由綠色變為紅色,由此可得出高位存放的是顏色資訊。

  4. 實驗任務4

    編寫完整彙編源程式,實現向記憶體0:200~0:23F依次傳送資料0~63(3FH)。

    程式碼如下: 

 1 assume cs:code
 2 code segment
 3             mov ax,0h
 4             mov ds,ax
 5             mov bx,0200h
 6              
 7             mov dx,0h
 8             mov cx,40h
 9 s:         mov ds:[bx],dl
10             add dx,1
11             add bx,1
12             loop s
13 
14             mov ax,4ch
15             int 21h
16 code ends
17 end

    綜合使用[bx]和loop,編寫彙編源程式 靈活使用debug的t命令、g命令、p命令除錯。在程式退出前,用d命令檢視 0:200~0:23F,確認是否將0~3F傳送至此段記憶體區域。

    

    可見已將0~3F傳送至此段記憶體區域。

  5. 實驗任務5

    教材實驗4(3)(P121)

    程式碼如下:

 1 assume cs:code
 2 code segment
 3             mov ax,cs
 4             mov ds,ax
 5             mov ax,0020h
 6             mov es,ax
 7             mov bx,0
 8             mov cx,16
 9 s:         mov al,[bx]
10             mov es:[bx],al
11             inc bx
12             loop s
13             mov ax,4c00h
14             int 21h
15 code ends
16 end

    得到結果如下,可知完成功能;

    

    由於程式的起始地址由CS:IP指定,因此 mov ax,__處填寫CS;

    mov cx,__處填寫0016的原因:首先在edit編輯器中編寫上述程式碼,並彙編,連結,使用debug工具進行除錯;

    使用r指令得到cx中的值為001c,並通過使用u指令精確反彙編得到mov ax,4c00h的地址為0017,由此可知要將

    mov ax,4c00h之前的指令複製到0:200中,僅需將076a:0000~076a:0016的內容複製到裡面即可。因此該處填

    寫0016h。