天天看點

彙編(七)[bx]、 loop指令、debug與masm

5.1[bx]

  • [bx]是什麼?
    • 實際上debug的文法和masm編譯的文法是不一樣的
    • 如果直接使用 mov ax, [0] 是不行的,編譯器會把它看做 mov ax, 0
    • 需要使用bx, 比如 mov bx, 0, mov ax, [bx]的形式
    • mov ax, [bx]
      • 功能:将bx中存在的資料作為一個偏移位址EA,段位址SA預設在ds中, 将SA:EA處的資料送入ax中
  • mov ax, 2000H
      mov ds, ax
      mov bx, 1000H
      mov ax, [bx]
      inc bx
      inc bx
      mov [bx], ax
      inc bx
      inc bx
      mov [bx], ax
      inc bx
      mov [bx], al
      inc bx
      mov [bx], al           
  • 記憶體中的情況
    • 2000:1000 = BE
    • 2000:1001 = 00
  • 上述程式分析:
    1. 先看一下前三條指令

      mov ax, 2000H

      Mov ds, ax

      Mov bx, 1000H

      • 三條指令執行後:
        ds=2000
        
        bx=1000
                   
    2. 再看第四條指令:
      • 将記憶體中2000:1000處的字型資料送入ax中, 結果ax=00be
    3. inc bx inc bx, inc 表單自增, 執行後bx=1002
    4. mov [bx], ax
      • 将ax中的值送入 ds:bx=2000:1002中
      • ax == 00be,

    5.2 Loop指令

  • (x)的應用,比如:
    1. ax中的内容為0010, 我們可以用這樣描述:(ax)= 0010
    2. 2000:1000 處的内容為0010, 我們可以這樣來描述(21000)=0010
    3. 對于mov ax,[2]的功能, 我們來描述: (ax)=((ds)16+2)
    4. 對于mov[2], ax的功能,我們可以這樣來描述:((ds)16+2)=(ax)
    5. add ax, bx的功能:(ax)=(ax)+(bx)
    6. push ax的功能,我麼可以這樣描述:
  • idata表示常量
    1. mov ax, [idata]就代表mov ax,[1], mov ax, [2]等
  • 指令的格式:
    • loop 标号,CPU執行loop指令的時候, 要進行兩步操作
      1. (cx)=(ax)- 1
      2. 判斷cx中的值, 不為零則轉到标号處執行程式,否則向下執行
    • 從上述中。我們可以看到 cx中的值影響執行結果
    • 通常我們用loop指令來實作循環功能, cx中存放循環次數
  • loop具體應用:
    • 程式設計計算2的2次方,結果放在ax中
    • assume cs:code
      code segment
          mov ax, 2
          add ax, ax
          
          mov ax, 4c00H
          int 21H
          
      code ends
      end           
    • 計算2的三次方
      assume cs:code
      code aegment
          mov ax, 2
          add ax, ax
          add ax, ax
          
          mov ax, 4c00H
          int 21H
      code ends           
    • 計算2的12次方
      • assume cs:code
        code segment
            mov ax, 2
            ; 做11次add ax,ax
            mov cx, 11
            s:add ax, ax
            loop s
            mov ax, 4c00H
            int 21H
        code ends           

标号:

  1. 在彙編語言中,标号就代表了一個位址, 此程式中一個标号它實際上表示了一個位址, 這個位址處有一條指令:add ax, ax
  2. Loop s
    1. (cx)=(cx)-1
    2. 判斷cx中的值, 不為0則轉至标号s所表示的位址處執行, 如果為0,則執行下一條指令
  3. 一下三條指令

    mov cx, 11

    S:add ax, ax

    • 執行loop時, 首先要将(cx)- 1 若不為0 這繼續執行 add ax, ax, 是以利用cx來控制add ax, ax的執行次數
  4. 在cx中存放循環次數
    1. loop指令中的标号所辨別位址要在前面
    2. 要循環執行的程式段, 要寫在标号和loop指令中間

用加法計算123*236, 結果放在ax中

assume cs:code
  code segment
      mov ax, 0
      mov cx, 123
      s:add ax, 236
      loops
   
      mov ax, 4c00H
      int 21H
  code ends
  end           

5.3 在debug中用loop指令實作的循環過程

  • 首先,我們将它編輯為源程式檔案, 檔案名定義為p3.asm, 對齊進行編譯連結後生p3.exe, 然後再用debug對p3.exe中的程式進行跟蹤
  • 如果是循環比較多 可以使用debug的g指令調到指定位址, 跳過循環執行過程

5.4 debug和彙編編譯器masm對指令的 不同處理

  • debug指令
  • mov ax, 2000H
    mov ds, ax
    mov al, [0]
    mov bl, [1]
    mov cl, [2]
    mov dl, [3]           
  • masm彙程式設計式
  • assume cs:code
    code segment
        mov ax, 2000H
        mov ds, ax
        mov bx, 0
        mov al, [bx]
        mov bx, 1
        mov bl, [bx]
        mov bx, 2
        mov cl, [bx]
        mov bx, 3
        mov dl, [bx]
        
        mov ax, 4c00H
        int 21h
    code ends
    end           
  • 上面說在彙程式設計式中不能直接寫[2]這種格式,但是加上段位址也可以實作
  • assume cs:code
    code aegment
        movv ax, 2000H
        mov ds, ax
        mov al, ds:[0]
        mov bl, ds:[1]
        mov cl, ds:[2]
        mov dl, ds:[3]
        
        mov ax, 4c00H
        int 21H
    code ends
    end           

繼續閱讀