匯編(四)

一. DS和[address]

  • CPU要讀寫(xiě)一個(gè)內(nèi)存單元時(shí),必須要給出這個(gè)內(nèi)存單元的地址,在8086中,內(nèi)存地址有段地址和偏移地址

  • 8086中有一個(gè)DS寄存器,通常用來(lái)存放要訪問(wèn)的數(shù)據(jù)的段地址。

    mov bx, 1000H
    mov ds, bx
    mov al, [0]
    
    • 3條指令的作用是將10000H(1000:0)中的內(nèi)存數(shù)據(jù)賦值到al寄存器中
    • mov al, [address] 的意思將DS:address中的內(nèi)存數(shù)據(jù)賦值到al寄存器中
    • 由于al8位寄存器,所以是將一個(gè)字節(jié)的數(shù)據(jù)賦值給al寄存器

-8086不支持將數(shù)據(jù)直接送入段寄存器中,mov ds, 1000H是錯(cuò)誤的。

練習(xí) :

寫(xiě)指令,將al中的數(shù)據(jù)送入內(nèi)存單元1000H

mov bx, 1000H
mov ds, bx
mov [0], al

二.字符數(shù)據(jù)的傳遞(2個(gè)字節(jié))

寫(xiě)出下面指令執(zhí)行后寄存器ax,bx,cx中的值:

內(nèi)存.png
mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]

結(jié)果:

執(zhí)行結(jié)果.png

三.大小端

  • 大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中(高低\低高) (Big Endian
  • 小端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中(高高\(yùn)低低) (Little Endian

舉個(gè)?? :

image.png

注意:ARM既可以工作在大端模式,也可以工作在小端模式

練習(xí):

寫(xiě)出下面指令執(zhí)行后寄存器ax,bx,cx中的值:

image.png
mov ax, 1000H
mov ds, ax
mov ax, 11316
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx
結(jié)果解析.png

四.mov指令

mov 寄存器, 數(shù)據(jù)          -> 比如: mov ax, 8
mov 寄存器, 寄存器        -> 比如: mov ax, bx
mov 寄存器, 內(nèi)存單元       -> 比如: mov ax, [0]
mov 內(nèi)存單元, 寄存器       -> 比如: mov [0], ax
mov 段寄存器, 寄存器       -> 比如: mov ds, ax

注意: "mov 內(nèi)存單元,內(nèi)存單元"是不允許的,比如mov[0], [1]

五.add 和 sub指令

addsub指令通mov一樣,都有兩個(gè)操作對(duì)象,有如下幾種形式:

add 寄存器, 數(shù)據(jù)  -> add ax, 8
add 寄存器, 寄存器 -> add ax, bx
add 寄存器, 內(nèi)存單元 -> add ax, [0]
add 內(nèi)存單元, 寄存器 -> add [0], ax
sub 寄存器, 數(shù)據(jù) -> sub ax, 9
sub 寄存器, 寄存器 -> sub ax, bx
sub 寄存器, 內(nèi)存單元 -> sub ax, [0]
sub 內(nèi)存單元, 寄存器 -> sub [0], ax

六. 數(shù)據(jù)段

  • 對(duì)于8086來(lái)說(shuō),在編程是,可以根據(jù)需要,將一組內(nèi)存單元定義為一個(gè)段

  • 我們可以將一組長(zhǎng)度為N(N <= 64KB)、地址連續(xù)、起始地址為16倍數(shù)的內(nèi)存單元當(dāng)做專門(mén)存儲(chǔ)數(shù)據(jù)的內(nèi)存空間,成為數(shù)據(jù)段。比如用123B0H~123B9H這段內(nèi)存空間來(lái)存放數(shù)據(jù),我們就可以認(rèn)為123B0H ~ 123B9H是一個(gè)數(shù)據(jù)段,它的段地址為123BH,長(zhǎng)度為10個(gè)字節(jié)。

  • 如何訪問(wèn)數(shù)據(jù)段中的數(shù)據(jù):

    • DS存放數(shù)據(jù)段的段地址,再根據(jù)需要,用相關(guān)指令訪問(wèn)數(shù)據(jù)段中的具體單元。

練習(xí)

各寄存器的初始值:CS = 2000H,IP = 0, DS = 1000H,AX = 0, BX = 0;

  1. 寫(xiě)出CPU執(zhí)行的指令序列(用匯編指令寫(xiě)出)
  1. 寫(xiě)出CPU執(zhí)行完指令后,CS,IP和相關(guān)寄存器中的數(shù)值

3.再次體會(huì):數(shù)據(jù)和程序有區(qū)別嗎?如何確定內(nèi)存中的信息哪些是數(shù)據(jù),哪些又是程序?

內(nèi)存圖.png

解析:

  • 因?yàn)?code>CS = 2000H, IP = 0, 所以指令寄存器指向地址:20000H,所以首先執(zhí)行mov ax, 6622H

  • 接著執(zhí)行:jmp 0ff0: 0100,這里執(zhí)行跳轉(zhuǎn)指令跳轉(zhuǎn)到地址10000H

  • 在地址10000H處執(zhí)行mov ax, 2000H,接著執(zhí)行mov ds, ax這時(shí)候ds 的值為2000H

  • 再接著執(zhí)行mov ax, [0008],這時(shí)候?qū)?code>20008H處的數(shù)據(jù)賦值給ax,所以ax的值為c389H

  • 最后執(zhí)行mov ax, [0002],這時(shí)候?qū)?code>20002處的數(shù)據(jù)賦值給ax,所以ax的值為EA66.

答案:
CPU指令序列:

mov ax, 6622H
jmp 0ff0:0100
mov ax, 2000H
mov ds, ax
mov ax, [0008]
mov ax, [0002]

執(zhí)行完指令后:

CS:1000H
IP: 000BH
AX: EA66 
BX : 0
DS: 2000H

內(nèi)存中: 數(shù)據(jù)和程序沒(méi)有任何區(qū)別,CS:IP指向的是指令,DS:指向的是數(shù)據(jù).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容