更靈活的定位內存地址的方法05 - 零基礎入門學習匯編語言36

第七章:更靈活的定位內存地址的方法05

?

讓編程改變世界

Change the world by program


?

問題7.8

? [codesyntax lang="asm"]
assume cs:codesg,ds:datasg
datasg segment
db 'ibm             '
db 'dec             '
db 'dos             '
db 'vax             '
datasg endscodesg segment
start: mov ax,datasgmov ds,axmov bx,0mov cx,4s0: mov si,0mov cx,3s: mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16loop s0mov ax,4c00hint 21h
codesg ends
end start
[/codesyntax] 仔細閱讀上面的程序,看看有什么問題? 思考后請聽小甲魚分析! ?

問題7.8分析

? 問題在于cx的使用,我們進行二重循環,卻只用了一個循環計數器,造成在進行內層的時候覆蓋了外層循環的循環計數值。 多用一個計數器又不可能,因為loop指令默認cx為循環計數器。 怎么辦呢? ? 我們應該在每次開始內層循環的時候,將外層循環的cx中的數值保存起來,在執行外層循環的loop指令前,再恢復外層循環的cx數值。 我們可以用寄存器dx來臨時保存cx中的數值。 看看我們改進后的程序(下載源代碼) ? 上面的程序用dx來暫時存放cx中的值。如果在內層循環中,dx寄存器也被使用,該怎么辦? 我們似乎可以使用別的寄存器,但是CPU中的寄存器數量畢竟是有限的,如8086CPU只有14個寄存器。 在上面的程序中:

si、cx、ax、bx,顯然不能用來暫存cx中的值,因為這些寄存器在循環中也要使用;

cs、ip、ds也不能用,因為cs:ip時刻指向當前指令,ds指向datasg段;

可用的就只有:dx、di、es、ss、sp、bp等6個寄存器了。 ? 可是如果循環中的程序比較復雜,這些寄存器也都被使用的話,那么該如何? 我們在這里討論的問題是,程序中經常需要進行數據的暫存,我們怎樣做將更為合理。 這些數據可能是寄存器中的,也可能是內存中的。 我們可以用寄存器暫存它們,但是這不是一個一般化的解決方案,因為寄存器的數量有限,每個程序中可使用的寄存器都不一樣。 ? 我們希望尋找一個通用的方案,來解決這種在編程中經常會出現的問題。 顯然,我們不能選擇寄存器,那么可以使用的就是內存了。 我們可以考慮將需要暫存的數據放到內存單元中,需要使用的時候,再從內存單元中恢復。這樣我們就需要開辟一段內存空間。 一起來看再次改進的程序(下載源代碼) ? 改造后的程序中,用內存單元來保存數據。可是上面的作法卻有些麻煩,因為如果需要保存多個數據的時候,讀者必須要記住數據放到了哪個單元中,這樣程序容易混亂。 我們使用內存來暫存數據,這一點是確定了的,但是值得推敲的是,我們用怎樣的結構來保存這些數據,而使得我們的程序更加清晰,更容易讀懂和被接受? ?

我們來參考VC編譯器的做法!

一般來說,在需要暫存數據的時候,我們都應該使用棧,回憶一下,棧空間在內存中,采用相關的指令,如:push、pop等,可對其進行特殊的操作。 我們將再次改進我們的程序 !(下載源代碼) [buy]?獲得所有教學視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LVXVYMZRPZLE']視頻下載[/Downlink]

轉載于:https://www.cnblogs.com/LoveFishC/archive/2010/12/24/3846015.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nextgaussian_Java Random nextGaussian()方法與示例

nextgaussian隨機類nextGaussian()方法 (Random Class nextGaussian() method) nextGaussian() method is available in java.util package. nextGaussian()方法在java.util包中可用。 nextGaussian() method is used to generate the next pseudo-random Gaussian double valu…

Java PriorityQueue clear()方法與示例

PriorityQueue類clear()方法 (PriorityQueue Class clear() method) clear() method is available in java.util package. clear()方法在java.util包中可用。 clear() method is used to remove all the objects from this PriorityQueue. clear()方法用于從此PriorityQueue中刪…

圖像分割-邊緣連接

三種基本方法: 1:局部處理 2:區域處理 3:使用霍夫變換的全局處理 局部處理 根據預定的規則,將所有相似點連接起來。 用于確定邊緣像素相似性的兩個主要性質:1、梯度向量的幅度2、梯度向量的角度 由于要…

01-圖像ROI區域獲取

截取部分圖像數據 import cv2 def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.imread("E:\Jupyter_workspace\study\data/cat.png")#讀取照片,第二個參數若為0,則灰度圖;若不填或者1…

如何編寫測試計劃

有以下幾個方面需要作考慮: 1. 測試的范圍。要測試什么,這是肯定要明確的,即使你知道,你也要寫出來,讓看這份文檔的人知道測試的范圍。在確定測試內容的時候,還可以做一個優先級的區分,這樣能保…

java clone 序列化_關于Java對象深度Clone以及序列化與反序列化的使用

? 我們可以利用clone方法來實現對象只見的復制,但對于比較復雜的對象(比如對象中包含其他對象,其他對象又包含別的對象.....)這樣我們必須進行層層深度clone,每個對象需要實現 cloneable接口,比較麻煩,那就繼續…

java enummap_Java EnumMap containsKey()方法與示例

java enummapEnumMap類containsKey()方法 (EnumMap Class containsKey() method) containsKey() method is available in java.util package. containsKey()方法在java.util包中可用。 containsKey() method is used to check whether this map has values for the given key e…

02-對圖像進行邊界填充

import cv2 import matplotlib.pyplot as pltimg2 cv2.imread("E:\Jupyter_workspace\study\data/cat.png")#讀取照片,第二個參數若為0,則灰度圖;若不填或者1則彩色圖或本身圖top_size,bottom_size,left_size,right_size (50,50,…

正則基礎

http://www.ipc.me/regular_expression_07681.html文章錯誤: 1 字符集的一些應用 第二個正則少了一個左方括號。 2 字符集的元字符 /[]x]/中的第一個]左邊少了一個轉義符,在這種情況下轉義符還是不能省略的。擴展 1 回車符 換行符 http://www.c…

Windows Phone 7獨立存儲空間IsolatedStorage

Windows Phone 7的solatedStorage可以用來保存應用程序的數據和設置。結構圖如下 一、相關類 1.IsolatedStorageFile類 1)描述:表示在獨立存儲空間中的文件和目錄。 2)重要屬性 long AvailableFreeSpace:IsolatedStorage有效的剩余…

圖像分割-閾值處理詳解(迭代法、Otsu法、平滑改善法、邊緣改進法、分塊處理法、局部特性法、移動平均法)

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 閾值處理詳解基礎:基于全局的閾值處理1迭代算法(最小概率誤…

java 用戶控件_C#自定義控件VS用戶控件

C#中自定義控件VS用戶控件大比拼1 自定義控件與用戶控件區別WinForm中,用戶控件(User Control):繼承自 UserControl,主要用于開發 Container 控件,Container控件可以添加其他Controls控件自定義控件(Custom Control):繼…

Java FileDescriptor sync()方法與示例

FileDescriptor類sync()方法 (FileDescriptor Class sync() method) sync() method is available in java.io package. sync()方法在java.io包中可用。 sync() method is used to synchronize all the system buffer with the underlying device. sync()方法用于將所有系統緩沖…

windows 7資源管理器崩潰解決方法

最近被頻繁的資源管理器explorer崩潰搞得幾乎生活不能處理,一打開帶有視頻的文件夾,就explorer崩潰,要瘋了。 日志中含有mpc_mtcontrol.dll 查來查去,沒有一個確定的答案,baidu,google都沒用,最…

03-對圖像進行數值計算和加權融合

數值計算 import cv2img_1 cv2.imread(E:\Jupyter_workspace\study\data/beyond.png) img_2 cv2.imread(E:\Jupyter_workspace\study\data/water2.png)img_1_1 img_1 10 img_1[:2,:,0]#輸出前兩行就行 img_1_1[:2,:,0]#[h,w,c] img_2[:2,:,0]#[h,w,c](img_1 img_2)[:2,:,…

SQL Server存儲過程(procedure)應用

用戶反映,系統操作日志會使用數據庫快速增大,情況可參考下圖, 問題分析,整個系統每個頁面,都有寫記錄用戶操作代碼,修改或禁用這個代碼,看來是不可能的。 在原有系統參數表添加一個選項&#xf…

Opencv一維直方圖的繪制

下面是我參考《opencv3編程入門》寫的繪制一維直方圖的代碼 using namespace cv; using namespace std; #define byte uchar #define TYEPE_GRAY 0 #define TYEPE_RGB 1 /*--------------------------繪制RGB三色一維直方圖-------------------------------------*/ Mat My_R…

Java類class forName()方法及示例

類類forName()方法 (Class class forName() method) forName() method is available in java.lang package. forName()方法在java.lang包中可用。 forName() method is used to return the class object for the Class with the given class_name. forName()方法用于返回具有給…

04-圖像的閾值操作

對圖像的閾值操作 import cv2 import matplotlib.pyplot as pltimg cv2.imread(E:/Jupyter_workspace/study/data/cat.png,1) ret, thresh1 cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret, thresh2 cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret, thresh3 c…

java虛擬機內存監控_深入理解JVM虛擬機9:JVM監控工具與診斷實踐

本文轉自:https://juejin.im/post/59e6c1f26fb9a0451c397a8c本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看https://github.com/h3pl/Java-Tutorial喜歡的話麻煩點下Star哈文章將同步到我的個人博客:…