最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

匯編語言之尋址方式(超詳細~)

2022-06-24 14:05 作者:補給站Linux內(nèi)核  | 我要投稿

1 固定尋址(inherent addressing )

  • 特定的單操作數(shù)指令,操作數(shù)隱含在操作碼中,在固定尋址的指令中,操作數(shù)被隱含在指令中,不需要執(zhí)行總線周期,執(zhí)行速度快

例子:

  1. CBW命令,將AL中的符號位擴展到AH中,形成16位的操作數(shù)。比如AL中的符號位是1,則執(zhí)行CBW命令后,AH則變成FF,如果符號位是0,則AH則變成00

  2. PUSH AX ,源操作數(shù)是寄存器AX,目的操作數(shù)為堆棧頂部,將AX寄存器中的內(nèi)容壓入堆棧

  3. CWDE命令,是32位匯編指令,將AX中的符號位擴展到EAX的高位。

2 ?立即數(shù)尋址 (immediate addressing)

  • 立即數(shù)尋址中,操作數(shù)包含在指令中,作為指令的一部分。特點:執(zhí)行速度快,主要給寄存器賦值。同樣不需要執(zhí)行總線周期。

例子:

  1. mov ax,14 ;主要給寄存器賦值,不能直接給段寄存器賦值,如不能mov ds/es/ss/cs ,立即數(shù),會報錯

3 寄存器尋址(register addressing)

  • 說白了,就是操作數(shù)在寄存器中,直接去寄存器中尋找操作數(shù)。

例子:

  1. mov ax,bx ;兩個操作數(shù)都是寄存器尋址,

  2. mov [1234h],ax ; 將AX寄存器中的值給地址1234處,當然段地址在DS中,可以用debug做實驗驗證下,如下:

運行-debug -r 查看寄存器中的值 -a 編輯匯編命令 輸入mov ax,12 mov [1234],ax, 然后查看1234處的指令 -d ds:1234 ?;驗證此時的值 然后運行兩次 -p命令, 然后執(zhí)行-d ds:1234命令,可以看到1234處的值變了


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


4 ?存儲器尋址(momory addressing)

  • 就是操作數(shù)存放在存儲器中,用存儲器尋址的指令,操作數(shù)一定在數(shù)據(jù)段、堆棧段、附加段中的主存儲器中,指令中一定包含有存儲器單元的地址或產(chǎn)生存儲器單元地址的

  • 信息,執(zhí)行指令時,CPU先根據(jù)指令提供的地址信息,計算出偏移地址,用地址產(chǎn)生器產(chǎn)生出直接訪問的內(nèi)存地址,再從內(nèi)存中取到操作數(shù),執(zhí)行規(guī)定的操作。

  • 注意點:

  1. 可以采用段跨越前綴的方式來改變系統(tǒng)指定的默認段,(有的人叫段超越),默認的是DS段

  2. 串處理指令必須用ES段

  3. 棧操作指令必須用SS段

  4. 指令必須在CS中

  • 儲存器的地址是 段基地址偏移4位+偏移地址 ,由于偏移地址是16位的,所以2的16次方是64K,所以每個段的最大長度為64K 。存儲器尋址方式如下:

4.1 直接尋址方式(direct addressing)

例子:

  1. mov al,[2000] ;源操作數(shù)是直接尋址,目的操作數(shù)是寄存器存執(zhí),指令執(zhí)行結(jié)果是將DS段中的偏移地址為2000的字節(jié)單元傳送到AL中

  2. mov ax,[2000] ; 唯一與上一條不同的是將字單元傳送到AX中

  3. mov ax ,es:[2000] ;段超越

  4. mov dword ptr [1234] ,eax ;將EAX中的32位雙字數(shù)據(jù)傳送到內(nèi)存中,目的操作數(shù)采用的存儲器存執(zhí),源操作數(shù)采用寄存器存執(zhí)。

4.2 寄存器間接尋址方式(register indirect addressing)

  • 指操作數(shù)的偏移地址存放在制定的寄存器中,寄存器作為指針指向內(nèi)存單元,而操作數(shù)在存儲器中,這樣的寄存器稱為間址寄存器

  • 在8086CPU中,只能使用BX,BP,SI ,DI 四個寄存器來充當存儲器地址來進行尋址。BX,BP作為基址寄存器,SI,DI變址寄存器

  • 當BX,SI,DI作為間址寄存器時,默認段寄存器在DS中,BP作為間址寄存器時,默認段寄存器為SS。

  • 當然可以采用段超越改變段地址。

4.3 寄存器相對尋址方式(register relative addrssing)

  • 與寄存器間接尋址方式類似,但不同的是,指令中還需要指定一個位移量,對于16位系統(tǒng)來說,位移量是8位或16位,對于32系統(tǒng)來說,位移量是

  • 8位或32位的位移量,位移量是一個帶符號的整數(shù)。

  • mov ax,10h[si] ?;等值與mov ax,[si+10h]

4.4 基址變址尋址方式(based indexed addressing)

  • 操作數(shù)的偏移地址一部分在基址寄存器,一部分在變址寄存器,基址寄存器的內(nèi)容加上變址寄存器的內(nèi)容就是操作數(shù)的偏移地址,

例子:

mov ax,[bx][si] 等價于mov ax,[bx+si]

4.5 相對基址變址尋址方式(relative based indexed addressing)

  • 帶位移量的基址變址尋址方式稱為基址 變址尋址方式。

例子:

mov ax,100[bx][si] ?;段地址再DS中 mov ax,100[bp][si] ; 段地址再SS中

4.6 比例變址尋址方式(scaled indexed addressing)

  • 只有在32位及以后的80X86系統(tǒng)中使用,暫不介紹

  • 5 I/O地址尋址(

  • 分為直接端口尋址和間接端口尋址

5.1 direct i/o port addressing

  1. 用00h-ffh表示最低的0-255個8位的I/O端口地址,就可以直接進行I/O端口尋址,則可以尋址256個。

  2. in al,80h;將80h端口的數(shù)據(jù)輸入到AL寄存器中

  3. in ax,80h;將80H端口的數(shù)據(jù)輸入到AX寄存器中。

  4. out 80h,AL;字節(jié)輸出指令,將AL寄存器的內(nèi)容輸入到80H端口

5.2 indirect i/o port addressing

  1. 如果端口大于256個,則可以尋址65536個端口,必須使用間接尋址,先把0000H-FFFFH端口號存放到DX中,然后將DX寄存器中的值

  2. mov ax,200h

  3. out dx,al ; jiang AL輸出到DX所指向的端口中

  4. mov dx ,200h

  5. in ax ,dx;將dx所指向的端口的一個字輸入到AX寄存器中。

  6. 與轉(zhuǎn)移地址有關(guān)的尋址

  • 此類主要說的是轉(zhuǎn)移指令,轉(zhuǎn)移指令可以改變指令的執(zhí)行順序,進行跳轉(zhuǎn),簡言之,就是改變CS和IP的值,從而改變下一條要執(zhí)行的指令的物理地址

  • 轉(zhuǎn)移分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移,段內(nèi)轉(zhuǎn)移只是改變IP,并不改變CS,段間轉(zhuǎn)移都改變。

  • 段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移,都可以使用直接尋址和間接尋址

6.1 段內(nèi)直接尋址 (intra segment indirect addressing)

  • jmp label ;label 為轉(zhuǎn)移的地址符號,也稱標號,

具體例子如下:

jmp short s add ax,1 s:inc ax 當執(zhí)行到jmp short s 后,會跳轉(zhuǎn)到inc ax 執(zhí)行。

6.2 段內(nèi)間接尋址(intra segment indirect addressing)

  • 轉(zhuǎn)移的偏移地址是一個寄存器或時一個存儲單元的內(nèi)容,舉例:

jmp bx ;BX內(nèi)容傳送到IP寄存器中,作為段內(nèi)偏移地址 jmp word ptr [bp] ;BP指向的內(nèi)存單元的一個字傳送到IP,作為偏移地址 jmp word ptr[bp +val] ;BP+VAL指向的內(nèi)存單元的一個字送給IP,作為偏移地址

6.3 ?段間直接尋址(inter segment direct addressing)

段間尋址和段內(nèi)直接尋址類似,指令中直接給出轉(zhuǎn)移地址,與段內(nèi)尋址不同的是,段內(nèi)直接尋址時,指令中提供了轉(zhuǎn)移地址的段地址和偏移地址 將其中的段地址傳送給CS,偏移地址傳給IP. 完成程序控制間的段間轉(zhuǎn)移 例子:jmp far ptr nseg ;在符號地址nseg之前加上表示段內(nèi)轉(zhuǎn)移的操作符far ptr

6.4 段間間接尋址(inter segment indirect addressing)

  • 間接的獲取轉(zhuǎn)移的段地址和偏移地址,目的地址的段地址和偏移地址存放在內(nèi)存中,這里存儲單元的地址是由指令制定存儲器尋址方式獲取的

指令的格式:

jmp dword ptr [si] ;尋址方式為存儲器尋址方式, dword ptr ?為雙字操作符,說明轉(zhuǎn)移地址需取雙字為段間轉(zhuǎn)移地址,其中高字是段地址。轉(zhuǎn)入CS,低字轉(zhuǎn)入IP. jmp dword ptr [addr] ? ?;在32位系統(tǒng)中,使用存儲器尋址方式獲取內(nèi)存單元的48位指針,其中的低32位送EIP寄存器,高16位從CS寄存器,就能取得轉(zhuǎn)移地址



匯編語言之尋址方式(超詳細~)的評論 (共 條)

分享到微博請遵守國家法律
奈曼旗| 开阳县| 涞源县| 隆子县| 马龙县| 铜山县| 寻乌县| 岳阳县| 庆云县| 浙江省| 尉犁县| 勃利县| 彰化县| 漠河县| 文成县| 望江县| 竹北市| 郑州市| 三穗县| 凤山市| 长海县| 双鸭山市| 武胜县| 平乡县| 三江| 台南市| 贡嘎县| 宁蒗| 泽州县| 元氏县| SHOW| 特克斯县| 积石山| 翼城县| 黄大仙区| 滁州市| 罗甸县| 监利县| 桂平市| 望谟县| 祥云县|