天天看點

彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段

寄存器(記憶體通路)

3.1 記憶體中字的存儲

  • 把0位址開始存放 4e20
  • 0号單元是低位址單元,1号單元是高位址單元
20
1 4e
2 12h
  • 任何兩個位址連續的記憶體單元,n号單元和n+1号單元,可以将他們看成兩個記憶體單元,也可以看成一個位址為n的字單元中的高位位元組單元和低位位元組單元
    • 高位單元:n+ 低位單元:n

3.2 DS和[Address]

  • CPU要賭氣一個記憶體單元的時候,必須先給出這個記憶體單元的位址
  • 記憶體位址是由:段位址和偏移位址組成的
  • CPU中有一個DS寄存器,通常用來存放要通路的資料的段位址
mov bx, 1000
  mov ds, bx
  mov al, [0]           
  • 上面三條指令将10000(1000:0)中的資料讀到al中
mov al, [0]
  • 已知的mov指令可以用完成兩種傳送功能
    1. 将資料直接送入寄存器
    2. 将寄存器中的内容送入另一個寄存器中
  • 除此之外,mov指令還可以将一個記憶體單元中的内容送入一個寄存器

    *上面就是 将記憶體偏移位址為0的内容送入ax低八位(al)寄存器

  • mov指令格式:
    • mov 寄存器,記憶體單元位址
    • […]表示一個記憶體單元,”[…]“中的0表示記憶體單元的偏移位址
    • 執行指令時 CPU會自動取DS中的資料為記憶體單元的段位址
      1. 将1000放入ds ,但是不會能直接放入到ds,ds是一個段寄存器 不是通用寄存器,不支援将資料直接送入 需要借助通用寄存器
      2. 用mov al, [0] 完成傳送 (mov指令中的【】說明操作對象是一個記憶體單元的偏移位址,是0 它的段位址預設放在ds中
    • 資料 -> 通用寄存器 -> 段寄存器
  • Mov bx, 1000 為将資料送入寄存器
  • mov bx, 1000; mov ds, bx; mov [0], al; 将資料從寄存器送入記憶體單元 最終的結果:就是把al寄存器中的内容送入[0](1000:0)記憶體單元中
  • mov bx, 1000; mov ds, bx; mov al, [0]; 将記憶體單元送入寄存器 最終結果:就是把[0](1000:0)記憶體單元送入al寄存器

3.3 字的傳送

  • 16結構的從CPU 有16根資料線,是以一次性傳送16位的資料,也就是一次性傳送一個字
  • mov bx, 1000
      mov ds, bx
      # 上面為:将1000送入到ds中  設定預設段位址為:1000
      mov ax, [0]  # 将1000:0處的字型資料送入 ax, 因為是ax 16位寄存器 是以是字資料,al為8位寄存器就是直接資料 也可以稱為16個位元組資料或一個字資料
      mov [0], cx  # 将cx中的16位資料送到1000:0處           
    彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段
    彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段
  • 答案:執行步驟詳解

    mov ax, 1000  # 将1000指派給ax  ax=1000
    mov ds, ax    # 将ax指派給ds為預設段位址  ds=1000
    mov ax, [0]   # 将 ds:0(23) 指派給ax  因為ds:0是位元組單元 而ax是字單元 是以自動會把高八位ds:1(11)拉出來  是以ax=1123
    mov bx, [2]   # 将 ds:2(22) 指派給bx 拖一個高位址  bx=6622
    mov cx, [1]   # 将 ds:1(11) 指派給cx 拖一個告地狀  cx=2211
    add bx, [1]   # 将 ds:1(11) 拖一個高位址 2211加上bx(6622)  bx=8833
    add cx, [2]   # 将 ds:2(22) 6622+2211  cx=8833
    mov al, [1]   # 如果是指派給位元組寄存器  那麼 al的值為 ds:1(11)  ax 8811           
  • 第二題答案:

  • 彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段
  • 彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段
    mov ax, 1000  # 将ax設定為 1000
    mov ds, ax    # 将段位址設定為 ax=1000
    mov ax, 2c34  # 将ax 設定為2c34  十進制:11316
    mov [0], ax   # 将1000:0 設定為ax    mov 10000:0, ax
    mov bx, [0]   # 将bx 設定為  1000:0 = ds:0 = 2c34
    sub bx, [2]   # bx = bx-ds:2  拖一位高位址 ds:2 = 1122    bx = 2c34 - 1122 = 1b12
    mov [2], bx   # 将ds:2的值設定為  bx  1b12           

    3.4 mov、add、sub指令

  • mov指令的幾種形式

    1. mov 寄存器, 資料 # 這裡的寄存器為通用寄存器
    2. mov 寄存器,寄存器
    3. mov 寄存器,記憶體單元
    4. mov 記憶體單元,寄存器
    5. mov 段寄存器,寄存器
    6. mov 寄存器,段寄存器
  • add sub 是一樣的

  • 彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段

    3.5 資料段

  • 我們可以根據需要将一組記憶體單元定義為一個段(可以是代碼段、資料段等)
  • 我麼可以将一組資料長度為n(n<=64)、位址連續、起始位址為16的倍數的記憶體單元當做專門存資料的記憶體空間,進而定義了一個資料段。
  • 比如123B0~123B9這個空間來存放資料:
    • 段位址:123B
    • 長度:10位元組 (0~9 十個位元組)
  • 如何通路資料段中的資料?
    • 将一段記憶體當做數段,是我們在程式設計的時候的一種安排,我們可以在具體操作的時候,用ds存放資料段的段位址,在根據需要,用相關指令通路資料段中的具體單元
  • 要累加這個資料段中的前3個單元中的資料,代碼如下:
  • mov ax, 123b
    mov ds, ax
    mov al, [0]  # 隻有用8位位元組寄存器(al)才可以,不然會拖一個高位址記憶體單元過來
    add al, [1]
    add al, [2]           
  • 要累加這個資料段中前3個字型資料,代碼如下:
    mov ax, 123b
    mov ds, ax
    mov ax, [0]  # 一個字型資料 占兩個記憶體單元,是以便宜位址是0,2,4
    add ax, [2]
    add ax, [4]           

小結:

  1. 字在記憶體中存儲時,要用兩個連續的記憶體單元來存放,字的地位位元組存放在低位址單元中。高位位元組存放在高位址單元中
  2. 用mov 指令要通路記憶體單元,可以在mov指令中給出單元的偏移位址,此時段位址預設在ds寄存器中
  3. [address] 表示一個 段位址為ds 偏移位址為address的記憶體單元
  4. 在記憶體和寄存器之間傳送字型資料時。高位址單元和高8位寄存器、低位址單元和低8位寄存器相對應。
  5. mov、add、sub 是具有兩個操作隊形的指令 、jmp(無條件跳轉)是具有一個操作對象的指令
  6. 可以根據自己的推測在 debug中實驗指令的格式是否正确 以及結果