如何對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 byteptr 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。