【匯編語言】8086匯編,快速搞定各種尋址方式:立即數尋址 / 寄存器尋址 / 存儲器尋址

0 前言

眾所周知,對于8086匯編語言,有幾大尋址方式,不過我覺得這個好墨跡,會用就可以了,為什么命名這么多,這次只說本質,不說命名,至于命名,還是得知道,畢竟是大部分人公認的,不能反抗這點哦,但是你知道,不代表你真的要這么去想。

1 何為尋址?何為尋址方式?

看了很多資料,讓人眼花繚亂,各種專業詞匯讓人眼花繚亂,撲朔迷離,我直接用最簡練的語言說明。

  • 尋址,就是找數據
  • 尋址方式,就是找數據的方法

接下來,根據數據的位置,我再細說一下各種尋址方式。

2 立即數尋址

一句話,在指令中找數據

訪問方式: 找指令的時候,順便將數據帶過來了,怎么找指令就怎么找它。

舉例:

mov ax,1000h

1000h就是立即數,也就用到了立即數尋址

3 寄存器尋址

一句話,在寄存器中找數據

訪問方式: 直接寫上寄存器的名字,就能訪問了。

舉例:

mov ax,1000h

ax就是寄存器的名稱,也就用到了寄存器尋址

4 存儲器尋址

一句話,在存儲器中找數據。(這里的存儲器,通常情況下指的是主內存)

訪問方式: 表示出存儲單元的地址,就能訪問了。

唯獨存儲器尋址比較麻煩,因為它表示地址的方式有很多種

但是在我這里,也就一句話,地址的形成方式是:BX,BP,SI,DI和立即數的各種組合

其實也就這些而已,只不過還有一些其他的規則限定,我也來細說一下(順便說一句,這些東西,先看懂理解,然后自己動手試一下,多試試就學會了,不要背)。

BX —— based register——基地址寄存器
BP —— base point——基礎指針
SI —— source index——源變址寄存器
DI —— destination index——目的變址寄存器

先給出你英文全稱,你就很快能夠知道,為什么是這幾個寄存器了。

4.1 語法格式

mov ax,dataSegmentName
mov ds,ax
mov 目標,[address]

使用存儲器尋址的時候,需要

  1. 設置好DS的值
  2. 再設置[address]的值,address的內容,就是上面說的

4.2 各種存儲單元地址的生成方式

這里,我結合大家公認的命名,以及我自己的觀點,闡述這些內容。

不管是什么尋址方式,本質就是為了生成address的值,生成數值的本質,就是我說的5個東西(bx,bp,si,di,立即數)進行基本的數學運算

  1. 寄存器直接尋址
    由立即數提供偏移地址。
mov ax,ds:[1000h]

在匯編語言中,立即數作為偏移地址,前面需要顯式地加上提供段地址的寄存器,另外,這種顯式的方式,一樣可以應用于后面的方式,但是不是強制的。

  1. 寄存器間接尋址
    bx,si,di提供偏移地址,注意沒有BP,至于原因,與硬件設計和語法設定有關,不必追究。
mov ax,[bx] ; 也可以寫上 mov ax,ds:[bx]
mov ax,[si]
mov ax,[di]

另外,也可以使用其他段寄存器(ss,cs,es)提供段地址,顯示加上就可以,mov ax,ss:[bx],這樣就由ss提供段地址,bx提供偏移地址。

  1. 基址尋址
    bx + 位移量bp + 位移量提供偏移地址。

特殊:只有bp提供偏移地址的時候,默認ss寄存器提供段地址,其他的默認ds。

mov ax,[bx + 10H] ; 本質 mov ax,ds:[bx + 10H]
mov ax,[bp + 10H ]; 本質 mov ax,ss:[bp + 10H]

另外,在尋址范圍之內,位移量可正可負可為0,下面的4,5也是這樣。

  1. 變址尋址
    si + 位移量di + 位移量提供偏移地址。
mov ax,[si - 10h]
mov ax,[di - 10h]
  1. 基址變址尋址
    1個基址寄存器 + 1個變址寄存器 + 位移量提供偏移地址,只有含有BP,就是SS提供段地址。
mov ax,[bx + si + 10h]

4.3 位移量為什么還可以是負數?

首先,你需要了解的是,這里的負數是十進制的負數,編碼方式是二進制補碼

位移量是正數,就代表在基礎之上,加了東西
位移量是負數,就代表在基礎之上,減了東西

說白了就是,可加可減,反正都是找數據,怎么找都可以,畫個圖你就明白了。

在這里插入圖片描述

你可能問,如果是bx - 11h,但是bx < 11h,不是成了負數?注意,在二進制世界,減過頭了,叫溢出,是正溢出,溢出的結果,就是循環回去。 我再畫個圖:
在這里插入圖片描述
對于有符號數

正溢出:兩數運算,大于最大的正數,進入負數區域
負溢出:兩數運算,小于最小的負數,進入正數區域

4.4 小結

注意,位移量其實就是個常數,也可以說成立即數,大多數情況不用區分。

1個:[常數][bx][si][di]
2個:[bx + 位移量][bp + 位移量][si + 位移量][di + 位移量]
3個:[(bx或bp)+ (si或di)+ 位移量],注意,不可以是[bx + bp + 位移量][si + di + 位移量]

4.5 思想方法

需要注意的是,以上是數學運算,都是加減法,但是這只是在8086中,未來,還會有乘法的出現,但是依然沒有脫離本質,address = { {BX,BP,SI,DI和立即數} 的基本數學混合運算}

希望你明白,之所以不要你去專注于各種被限定的尋址方式,是因為那些不是本質,掌握本質,把握知識源頭,才能夠更好地應對未來。

在x86-32匯編語言中,地址的生成方式,又有所改變。
例如:mov dword ptr [ebp+eax*4-6Ch],edx,如果你記憶的是8086匯編于尋址方式,那么這個新的方式,你依然要去記憶,但是如果你掌握的是本質,你就知道,這不過是在生成地址的過程中,增加了一個乘號而已,之后你再去探索一下,為什么增加這個乘號,你就可以快速透徹理解和掌握它了。

5 注意事項

需要注意的是,這些理解,是為了讓你抓住本質,但是并不代表,你只知道這些就可以了,內些雜亂的命名,依然有存在的價值,你同樣需要掌握。

最后,還有一個重要的感悟,那就是任何操作數,都需要應用到這些尋址方式,因為計算機的本質就是處理數據,數據又需要通過尋址來找到

推薦閱讀:計算機處理信息的本質,是二進制數的運算(本文第2節)

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

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

相關文章

信息安全工程師考試大綱(含pdf)

PDF文件下載鏈接&#xff1a; https://pan.baidu.com/s/1nSLBGfBc8HzFwE0xk9FzcQ 提取碼&#xff1a;9udy 信息安全工程師考試大綱 1&#xff0e;信息安全基本知識 1.1 信息安全概念 ● 了解網絡空間的概…

【數據庫】數據庫基本概念:數據庫管理系統 / 數據庫 / 表 / 數據

0 前言 本文講解數據庫的最基本概念 推薦書籍&#xff1a;《MySQL 必知必會》 需要的軟件&#xff1a;MySQL 8.0 1 數據庫相關概念及其實戰應用 1.1 數據&#xff08;Data&#xff09; 在人類世界中&#xff0c;數據可以是 數值型數據 十進制數 非數值型數據 圖片聲音視頻文…

tiny4412初期環境搭建

花了整整三天 從躍躍欲試到失望 絕望 最后迎來曙光!!! 話不多說直接上干貨 這些軟件安裝的具體過程網上有很多 在這里就不說了 1.在主機下 安裝secureCRT軟件和超級終端&#xff08;安一個就行 不過最好兩個都安上&#xff09; 作用&#xff1a; 軟件可以打印一些開發板信息…

vivado軟件如何查看內部器件的仿真信號

有時候&#xff0c;我們需要查看內部模塊的信號&#xff0c;那么&#xff0c;在vivado軟件該如何操作呢&#xff1f; 運行仿真&#xff0c;可以得到這個界面&#xff0c;之后看左側部分&#xff0c;可以查看內部的模塊。 例如單擊rom0 可以看見其內部信號&#xff0c;然后在想…

通過Source insight查看內核源碼

1.下載源碼 https://www.kernel.org/pub/linux/kernel/ 下載后解壓即可 2.打開SourceInsight,創建工程 點擊頂部Project菜單 3.將源碼文件導入工程 4.查看源碼

藍橋杯物聯網例程下載

今年是藍橋杯物聯網的第一屆 我也是趕快買了物聯網的開發板 這是附帶的例程和一些綜合實驗 僅供參考練習 里面所有的例程大概花了兩周實現了大部分&#xff08;有一些例如ADC和PWM的 手頭沒有示波器和電壓表就沒有做&#xff09; 我比較懶 不喜歡做每個例程的教程 就統一分享出…

Vivado軟件(用VerilogHDL)如何使用$readmemh和$readmemb函數

0 前言 博主我查了很多資料&#xff0c;雖然會使用Verilog的readmemh和readmemh和readmemh和readmemb函數&#xff0c;可是&#xff0c;在vivado軟件中怎么用&#xff1f;文件放在哪里&#xff1f;沒有一篇文章提及。 花了幾個小時&#xff0c;終于研究明白了&#xff0c;特此…

【匯編語言】王爽第六章程序6.3解答,8086匯編語言實現數據的倒序存放

程序很簡單&#xff0c;就是利用棧&#xff0c;實現數據的倒序存放。 ; 將數據逆序存放 assume ds:data data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data endsassume ss:stack stack segmentdw 0,0,0,0,0,0,0,0 stack endsassume cs:code code segmen…

---------愿 青春與我皆不付---------------------

2019年8月4日晚 21點51 我愿以此用博客來記錄我的學習之路 void mian(void) { while(1) { run(); } } 不負光陰 不負卿

【匯編語言】快速理解什么是尋址,什么是尋址方式

0 前言 有很多專業的資料講述這些概念&#xff0c;但是&#xff0c;雖然很專業&#xff0c;但是初學者根本看不懂&#xff01; 因此在這里&#xff0c;我用最簡單的方式&#xff0c;告訴你 什么是尋址什么是尋址方式 1 計算機的極簡模型 計算機的世界中&#xff0c;只有二…

【匯編語言】程序設計過程,如何避免數據類型匹配錯誤?

真言&#xff1a;操作數據&#xff0c;先看方式&#xff0c;再對應解決 0 前言 對于x86系列的匯編語言&#xff0c;AT&T格式需要使用后綴指明操作數的數據類型&#xff0c;Intel格式并沒有這樣的規定&#xff0c;但是&#xff0c;數據類型還是必須匹配&#xff0c;這就導…

【匯編語言】王爽實驗5(5)(6)的解答 建立數據類型匹配的觀念

0 前言 本文解答王爽《匯編語言》實驗5的&#xff08;5&#xff09;&#xff08;6&#xff09;題 同時給出一些常見問題的解答 以及給出最易犯錯的地方&#xff1a;數據類型不匹配的解決方案 1 題目解答 1.1 實驗5&#xff08;5&#xff09; 1.1.1 題目 將data1和data2段…

【Java圖文趣味版】快速搞定數組的聲明、開辟空間和初始化賦值

0 前言 本文講解java數組的基礎知識&#xff0c;適合零基礎小白。 1 數組的概念 所謂數組&#xff0c;就是一組同類型東西的集合&#xff0c;可以通過index&#xff08;索引&#xff0c;下標&#xff09;訪問這一組東西的某一個元素。 就像下圖這樣&#xff0c;由于數組概念…

【java圖文趣味版】數組元素的訪問與遍歷

0 前言 本文適合零基礎小白。 本文接上一篇文章&#xff1a;快速搞定數組的聲明、開辟空間和初始化賦值 重要的知識點 通過array index訪問數組使用for each循環遍歷數組使用Arrays.toString()方法打印數組 我們先創建一個數組&#xff0c;之后通過它來說明后面的知識。 …

初來乍到,多多關照。

從今天開始就要開始寫博客了&#xff0c;把學到的知識都在這里記錄下來&#xff0c;希望可以堅持&#xff0c;并且學到東西。

【MySQL】AUTO_INCREMENT只能應用于數值類型的列,且該列需要被索引

MySQL中的自動增量AUTO_INCREMENT&#xff0c;是有使用條件的 該列&#xff08;column&#xff09;的數據類型必須是數值型&#xff08;這點容易理解&#xff0c;數值才能自增&#xff09;該列必須被索引&#xff0c;比如定義為主鍵&#xff08;PRIMARY KEY&#xff09; 感悟…

【數據庫】數據模型基礎概念(圖文版)

0 前言 本文通過一個實例&#xff0c;來講解數據模型的基礎概念。 要求設計一個數據庫的數據模型&#xff0c;統計出你的宿舍每個人&#xff08;4個人&#xff09;的信息&#xff0c;要求包括 個人信息&#xff1a;學號、姓名、班級、年級、學院選課情況&#xff1a;學號、課程…

利用SIGCHLD信號回收子進程

子進程執行結束之后&#xff0c;父進程如果不對其進行回收&#xff0c;子進程就會變為僵尸進程。 父進程可以通過調用wait()函數和waitpid()函數去回收子進程. 由于子進程結束時會發送SIGCHLD信號給父進程&#xff0c;不過此信號的默認動作為忽略&#xff0c;我們可以通過系統函…

【匯編語言】8086匯編語言的debug中,t和p命令的區別

單步跟蹤命令&#xff08;單步進入(step in)&#xff09;&#xff1a;t命令是單步執行&#xff0c;是真的單步執行&#xff0c;碰到任何地方&#xff0c;都會一步步執行&#xff0c;遇到子程序&#xff0c;也會進入里面一步步執行再返回 單步執行命令&#xff08;單步通過(ste…