實驗4
?
實驗內容1:綜合使用 loop,[bx],編寫完整匯編程序,實現向內存 b800:07b8 開始的連續 16 個 字單元重復填充字數據 0403H;修改0403H為0441H,再次運行
?
步驟1:在記事本中編寫好temp.asm文件
?
步驟2:進入dosbox環境進行編譯連接并運行,屏幕特定位置顯示16個紅色愛心
?
步驟3:修改0403H為0441H,運行后觀察結果
?
?
Tips:
進入debug環境逐步調試時,發現并沒有修改b87b8H內存單元中的值。對比直接運行并在沒有清屏條件下進入debug運行,和直接在debug環境中修改寄存器取值,發現可能的原因是:輸出在屏幕上的符號是動態的,即刻顯示當前位置的符號。如果顯示的位置下面本來沒有代碼,后面輸入的代碼會覆蓋這些符號;如果下面你本來就有代碼,會隨著代碼的輸入而不斷上移位置
?
?
?
?
實驗內容2:綜合使用 loop,[bx],編寫完整匯編源程序,實現向內存 0:200~0:23F 依次傳送數據 0~63(3FH)
?
用loop, [bx]實現:
1、步驟1:在記事本中編寫好temp2.asm文件
?
步驟2:進入dosbox環境進行編譯連接并運行
?
步驟3:進入debug環境,靈活使用 debug 的 t 命令、g 命令、p 命令調試,用 d 命令 查看 0:200~0:23F,確認是否將 0~63 傳送至此段內存區域
?
?
(用g命令調試)
?
?
(用t命令逐步調試、p命令一起執行循環的部分,結果和用g命令一樣)
2、稍作改動,同樣能實現
?
?
?
?
實驗內容3:實現將“mov ax,4c00h”之前的語句全部復制到從0:200開始的一段空間中
步驟1:在記事本中編寫好temp3.asm文件(填空的內容為1. CS 2.offset last-offset start)
?
步驟2:進入dosbox環境進行編譯連接并運行
?
步驟3:靈活使用 debug 的 t 命令、g 命令、p 命令調試,用 d 命令查看 0:200 之后的若干字節,觀察是否將 mov ax, 4c00h 之前的指令復制到指定內存
?
?
?
?
?
?
實驗4——總結
收獲:本次實驗讓我熟悉了loop、[bx]的使用,弄懂了屏幕上輸出符號的位置與是否被覆蓋的問題,了解了怎么進行代碼的復制(怎么表示一段不知道大小的空間的大小),掌握了p命令的有一個功能——跳過循環的具體過程直接執行到循環結束。
?
問題:最后一個實驗為什么在復制完成以后還會多出一段數據呢?
?????? 實驗內容2的我嘗試了用loop、push做但是失敗了,查看內存單元發現并沒有修改原來的取值。那么到底應該如何實現呢?