一. 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寄存器中 - 由于
al是8位寄存器,所以是將一個(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中的值:

mov ax, 1000H
mov ds, ax
mov ax, [0]
mov bx, [2]
mov cx, [1]
add bx, [1]
add cx, [2]
結(jié)果:

三.大小端
- 大端模式,是指數(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è)?? :

注意:
ARM既可以工作在大端模式,也可以工作在小端模式
練習(xí):
寫(xiě)出下面指令執(zhí)行后寄存器ax,bx,cx中的值:

mov ax, 1000H
mov ds, ax
mov ax, 11316
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx

四.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指令
add和sub指令通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;
- 寫(xiě)出
CPU執(zhí)行的指令序列(用匯編指令寫(xiě)出)
- 寫(xiě)出
CPU執(zhí)行完指令后,CS,IP和相關(guān)寄存器中的數(shù)值
3.再次體會(huì):數(shù)據(jù)和程序有區(qū)別嗎?如何確定內(nèi)存中的信息哪些是數(shù)據(jù),哪些又是程序?

解析:
因?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ù).