匯編語言——寄存器(內存訪問 ds數據段寄存器)


在內存中字的存儲

這段話的主要意思是:一個字=2B=16bit,CPU中是用兩個內存單元儲存一個字(假如獲取0地址存放的字型數據,就是獲取它的高位字節0+1位低位字節0位的數據,數據由高地址位向低地址位讀)

問題:

(1)0地址單元中存放的字節型數據是多少?  #  20H
(2)0地址字單元中存放的字型數據是多少?  # 4e20H
(3)2地址字單元中存放的字節型數據是多少? # 12H
(4)2地址單元中存放的字型數據是多少?      #  0012H
(5)1地址字單元中存放的字型數據是多少?  # 12aEH

結論:就是我上面說的,字型數據就是它和它的下一位地址單元的數據(數據由高地址位向低地址位讀)

數據段寄存器DS和偏移量[address]

用法和cs和ip差不多,都是段寄存器的值*16+偏移量的值

為給DS數據段寄存器值

因為CPU的段寄存器都比較害羞,沒法給他們直接賦值(cs代碼寄存器用的是jmp cs:ip),所以段寄存器采用以下方法賦值

mov ax,1234H    # 將ax寄存器賦值為1234H

mov ds,ax    # 通過ax寄存器 間接賦值

字的傳送

mov ax,[1]    # []中的是偏移量 意思是將12341內存位置的字形數據賦給ax寄存器

mov al,[1]    # 將12341內存位置的字節形數據賦給al(低位)寄存器

mov  [1],ax    # 將ax寄存器字形數據賦給12341內存位置的值

mov [1],al    # 將al寄存器的字節形數據賦給12341內存位置

問題1:

內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?

解析:

問題2:

內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?

解析:

NB的move指令

mov 通用寄存器,數據		# mov ax,1234H
mov 通用寄存器,寄存器		# mov bx,ax / mov bx,ds(將段寄存器的值賦給通用寄存器)
mov 段寄存器,寄存器		# mov ds,ax(因為無法直接給段寄存器賦值,所以用通用寄存器當中介)
mov 內存單元,寄存器		# mov [0],ax(將ax寄存器中的值賦給ds*16+0這個內存單元)
mov 內存單元,寄存器		# mov ax,[0](內存單元ds*16+0的值賦給ax寄存器)

sub,add指令

數據段

我們上面操作的實際上就是數據段,具體來看下是怎樣操作數據段的

累加123B0H~123BAH的內存單元的操作

小結:

(1)字在內存中存儲時 ,要用兩個地址連續的內存單元來存放,字的低位字節存放在低地址單元中,高位字節存放再高地址單元中。
(2)用 mov 指令要訪問內存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中。
(3)[address]表示一個偏移地址為address的內存單元。
(4)在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。
(5)mov、add、sub是具有兩個操作對象的指令。jmp是具有一個操作對象的指令。

(2) 內存中的情況如圖3.6所示

各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;

①   寫出CPU執行的指令序列(用匯編指令寫出)。

②   寫出CPU執行每條指令后,CS、IP和相關寄存器的數值。

③   再次體會:數據和程序有區別嗎?如何確定內存中的信息哪些是數據,哪些是程序?

答案:我以為jmp了以后cp的值也會改變,實際上就是它jmp的內個CP:IP

指令序列

CS

IP

DS

AX

BX

初始值

2000h

0

0

0

0

1

mov ax,6622h

2000h

3h

0

6622h

0

2

jmp 0ff0:0100

ff0h

100h

0

6622h

0

3

mov ax,2000h

ff0h

103h

0

2000h

0

4

mov ds,ax

ff0h

105h

2000h

2000h

0

5

mov ax,[8]

ff0h

108h

2000h

c389h

0

6

mov ax,[2]

ff0h

10bh

2000h

ea66h

0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM