欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

匯編語(yǔ)言學(xué)習(xí)assume的作用詳解

 更新時(shí)間:2021年11月10日 17:22:32   作者:手寫的從前66  
這篇文章主要為大家介紹了匯編語(yǔ)言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

assume 的作用是關(guān)聯(lián)段名與段寄存器。

如果你在數(shù)據(jù)段中定義了變量名,比如:

x   db  0

而你在代碼中,需要直接使用這個(gè)變量名,比如:

mov   al,  x

那么,匯編程序在匯編時(shí),就會(huì)報(bào)告錯(cuò)誤。

因?yàn)椋琺ov指令中遇到 x 這個(gè)變量名時(shí),匯編程序不知道它要用哪個(gè)段寄存器作為段地址。

所以:

若要用變量名直接訪問(wèn),或使用語(yǔ)句標(biāo)號(hào)(比如你例子中的標(biāo)號(hào) start)就必須要在assume偽指令中將這些變量或標(biāo)號(hào)所在段的段名,與段寄存器名關(guān)聯(lián),否則會(huì)出錯(cuò)。

如果你不使用段中的變量名,可以不關(guān)聯(lián)這個(gè)段的段名與寄存器。

如果你訪問(wèn)變量時(shí),都指定了段跨越前綴,關(guān)聯(lián)也不是必須的。比如你可以用 mov al, ds:x訪問(wèn)變量 x 。

這幾天在看王爽大大的 匯編語(yǔ)言。對(duì)于assume偽指令卻很是不懂。

比如已經(jīng)定義了assume cs:code,ds:data

但用debug觀察的時(shí)候,發(fā)現(xiàn)ds段寄存器卻沒(méi)有相關(guān)聯(lián)的數(shù)據(jù)。

必須在cs中寫明: mov ax,data

                            mov ds,ax
然后才能發(fā)現(xiàn)ds中有正確的數(shù)據(jù)。

于是疑惑,assume不是已經(jīng)關(guān)聯(lián)了ds嘛?

上網(wǎng)求助 = =、 然后找到答案。

編寫程序,是寫給編譯軟件的。由編譯軟件,編譯成機(jī)器碼,再去控制CPU。但是,編譯軟件,對(duì)assume語(yǔ)句,并不生成機(jī)器碼。

所以,必須有mov ax,data,mov ds,ax,CPU才能受控。

---assume語(yǔ)句,是偽指令,僅僅是寫給編譯軟件的。編譯軟件,并不把它生成機(jī)器碼。

assume對(duì)除了CS以外的其它段寄存器,僅僅只是關(guān)聯(lián)了段名,以便在訪問(wèn)段內(nèi)變量時(shí)程序可以知道用哪個(gè)段寄存器,并沒(méi)有在程序加載時(shí)將段地址裝入段寄存器。

所以,將段地址裝入段寄存器的工作,必須由用戶在程序中自己編寫代碼,并在程序開始運(yùn)行時(shí)執(zhí)行代碼完成裝入工作。
僅僅對(duì)CS段寄存器,會(huì)在關(guān)聯(lián)段名的同時(shí),在程序加載時(shí)自動(dòng)將段地址裝入段寄存器。
----補(bǔ)充:前天知道了答案后,我以為assume ds:data 之類的指沒(méi)有什么用,只是給程序員看的。

但今天發(fā)現(xiàn)不是這樣的。 如果你在data中用了標(biāo)號(hào)的話,則assume ds:data不能省略。

比如:

data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends

a,b的后面沒(méi)有“ :”。

如果你想在cs段中用數(shù)據(jù)標(biāo)號(hào)訪問(wèn)數(shù)據(jù),則必須在開頭加上assume ds:data,否則會(huì)報(bào)錯(cuò)

Arror A2068:Can not address with segment register

不過(guò)就算在開頭加上了assume ds:data,代碼段中也不能少了mov ax,data,mov ds,ax。

作用:用于標(biāo)識(shí)默認(rèn)段前綴

解釋:assume 并不能改變ds等段寄存器的值,但他能改變編譯器產(chǎn)生的匯編代碼。比如:

assume ss:stack

stack segment

x :db 0

stack ends

如果程序需要mov ax,[x],那么程序如何定位[x]呢?我們知道x只是一個(gè)偏移地址0,所以此時(shí)assume就相當(dāng)于告訴編譯器stack段的所有標(biāo)號(hào)都與ss相關(guān)聯(lián),所以此時(shí)[x]就相當(dāng)于ss:[0].如果我們直接將這句改為mov ax,ss:[0],那么前面不加assume也是可以的.這也是為什么[0]被編譯器強(qiáng)制理解為立即數(shù),而[標(biāo)號(hào)]卻被理解為標(biāo)號(hào)里的內(nèi)容的原因,因?yàn)闃?biāo)號(hào)必須與段assume,否則會(huì)報(bào)錯(cuò)cannot address with segment register.而[0]無(wú)默認(rèn)段,就只能被認(rèn)為為立即數(shù)了.

所以,我們?nèi)孕柙诔绦蛑袑s的值,用指令修改為stack,原因就是assume并不會(huì)修改段寄存器,這個(gè)由dos系統(tǒng)決定,如果dos系統(tǒng)決定將段值編譯進(jìn).exe文件頭,并在加載進(jìn)內(nèi)存時(shí)根據(jù)文件頭,修改段值,那么此時(shí)assume就相當(dāng)于可以改變段值了.但是我調(diào)試的現(xiàn)實(shí)是ds、es指向psp頭(psp詳見16位exe程序加載過(guò)程),ss指向ds+0:00f0,cs指向ds+0:0100。

以上就是匯編語(yǔ)言學(xué)習(xí)assume的作用詳解的詳細(xì)內(nèi)容,更多關(guān)于匯編語(yǔ)言assume作用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • UEFI開發(fā)基礎(chǔ)匯編代碼的使用

    UEFI開發(fā)基礎(chǔ)匯編代碼的使用

    這篇文章主要為大家介紹了UEFI開發(fā)基礎(chǔ)匯編代碼使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 匯編語(yǔ)言中mov和lea指令的區(qū)別詳解

    匯編語(yǔ)言中mov和lea指令的區(qū)別詳解

    指令(instruction)是一種語(yǔ)句,它在程序匯編編譯時(shí)變得可執(zhí)行。本文給大家總結(jié)一下匯編語(yǔ)言中mov和lea指令的區(qū)別詳解,感興趣的朋友跟隨小編一起看看吧
    2020-01-01
  • 匯編語(yǔ)言編譯環(huán)境搭建過(guò)程

    匯編語(yǔ)言編譯環(huán)境搭建過(guò)程

    這篇文章主要介紹了匯編語(yǔ)言編譯環(huán)境搭建過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 匯編 函數(shù)調(diào)用的實(shí)現(xiàn)

    匯編 函數(shù)調(diào)用的實(shí)現(xiàn)

    這篇文章主要介紹了匯編 函數(shù)調(diào)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 什么是匯編語(yǔ)言

    什么是匯編語(yǔ)言

    匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言
    2020-01-01
  • 匯編語(yǔ)言進(jìn)制轉(zhuǎn)換之16進(jìn)制轉(zhuǎn)10進(jìn)制

    匯編語(yǔ)言進(jìn)制轉(zhuǎn)換之16進(jìn)制轉(zhuǎn)10進(jìn)制

    這篇文章主要介紹了匯編語(yǔ)言進(jìn)制轉(zhuǎn)換之16進(jìn)制轉(zhuǎn)10進(jìn)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 匯編語(yǔ)言位向量(位映射)的實(shí)現(xiàn)

    匯編語(yǔ)言位向量(位映射)的實(shí)現(xiàn)

    這篇文章主要介紹了匯編語(yǔ)言位向量(位映射)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺析ELF轉(zhuǎn)二進(jìn)制允許把 Binary 文件加載到任意位置

    淺析ELF轉(zhuǎn)二進(jìn)制允許把 Binary 文件加載到任意位置

    本文通過(guò) eip + 偏移地址 實(shí)現(xiàn)了運(yùn)行時(shí)計(jì)算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2020-02-02
  • 圖文詳解通俗易懂的匯編語(yǔ)言寄存器

    圖文詳解通俗易懂的匯編語(yǔ)言寄存器

    這篇文章主要為大家介紹了寄存器的內(nèi)容詳解,文中通過(guò)精美清晰的圖文方式讓你一看就通俗易懂,有需要的朋友可以借鑒參考學(xué)習(xí)下,希望能夠有所幫助
    2021-11-11
  • 匯編語(yǔ)言學(xué)習(xí)心得

    匯編語(yǔ)言學(xué)習(xí)心得

    匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。這篇文章主要介紹了匯編語(yǔ)言學(xué)習(xí)心得,需要的朋友可以參考下
    2020-01-01

最新評(píng)論