[bx]是什么
[bx]這個表達方式和[0]很像,他們倆的功能也很像。之前就提到了,[0]表示一個內存單元,他的偏移地址是0。從這邊我們可以引出內存單元的定義:要有內存單元的地址,要有內存單元的長度(類型,例如字單元和字節單元)
那么[bx]其實也和[0]差不多,其中0代表偏移地址是0,那么[dx]中的dx就是代表他的偏移地址在dx中,所以按照內存單元的定義來說,[dx]也表示一個內存單元,這個內存單元的偏移地址在bx中。
?這邊要區分開bx和[bx],bx是類似寄存器的東西,他是有地址的,這個地址可以放數據的,[bx]則表示一個內存單元,有地址有長度
如果還是不太理解可以看一下書里面97頁的實驗。?
loop是什么
從字面上看loop就是循環的意思,執行loop指令的時候會執行兩步操作,先會把cx中存放的內容減一,再判斷cx的值,如果不為零則繼續執行標號處的指令,如果為零則跳出循環繼續執行標號處下一條的指令。
從這兩步操作我們可以知道,cx中存放的內容是loop循環的次數,所以在使用loop循環之前,我們要先給cx賦值需要的循環次數。?
至于標號,我們之前也沒碰到過,其實就是在指令前面加一個字符:用來表示標號,類似這樣子
這邊就給cx放入內容11,標號s,之后執行loop s就會重復11次標號s的指令。
儲存循環次數的寄存器有三個從小到大依次是c1,cx,ecx,分別是二進制的8、16、32位。
debug和masm匯編編譯器對指令的不同處理
之前我們大多實在debug的環境下也就是dosbox提供的dos環境去調試匯編語言,但并不是所有的調試器編譯器對匯編語言的解釋都是一樣的,就像這個小標題一樣。
這邊就寫一點點:書本中舉例的是 mov ax,[0] 這條指令。對于debug調試器來說就不多說了,和前面說到的都一樣,但是對于masm編譯器來說這條指令中的[0]就會被解釋成0,我們知道[0]代表的是內存單元,但是對于0masm就會有獨特的邏輯去執行。
這邊只是那這兩個去舉個例子;到這邊可能會想,那怎么讓匯編語言具有較好的兼容性?可以去搜看看,這邊不多寫。
對于循環的定義方式
上面我們利用標號s來作為循環的名稱,s:后面的指令則是要循環的指令。這邊要去查循環的指令不止是單單s:后面那句,也可能是一段,循環語句結束的標識是loop+標號。例如
想這種的就說明一整段都是循環語句
像這種的就是只有標號后面那一句。
關于類似c1,cx,ecx三個寄存器的關系
這三個寄存器是類似包含的關系,首先這三個寄存器依次可以存放8,16,32位二進制數,對應的十進制分別是255,65535,4294967295,其中c1同時是cx和ecx的低八位,cx是ecx的低八位,我們可以通過給這三個賦值去控制循環的次數。因為他們有類似包含的關系,所有當他們三個寄存器肯定是同時有數據或者無數據的,所有也不存在沖突的現象。
當然其他的寄存器類似ax,bx也同樣是這種包含的結構。
使用指令對于操作數據長度和寄存器大小的要求
類似這段指令
粗看一邊可能會有疑問為什么不直接把ds:bx的數據放入ax,而是放入a1。
這是因為操作的數據長度和寄存器的大小要一致,首先我們是依次把ffff:0~ffff:b地址內的數據給放入寄存器中,x86 架構的內存基本單位是以八位二進制數為最小內存和訪問單元的,所以ffff:1內的數據大小最大也是一個字節也就是八位二進制數,所以要用也是1個字節的寄存器a1來接收這個數據。
段前綴
段前綴是用于強制指定內存訪問所用段寄存器的指令前綴,其核心功能是打破 CPU 對段寄存器的默認選擇,靈活訪問不同段中的內存數據,是 x86 分段內存模型中實現靈活內存訪問的重要機制。
其代碼結構類似
mov ax, cs:[si]
其中cs就是段前綴。