日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言笔记(一):基础

發布時間:2024/7/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言笔记(一):基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

章節目錄

  • 簡單程序
  • 使用段
  • 簡單字符串處理程序
  • 使用 bx, si, di, bp 寄存器尋址
  • 尋址方法
  • 指明數據長度
  • div指令
  • 作者能力有限, 如果您在閱讀過程中發現任何錯誤, 還請您務必聯系本人,指出錯誤, 避免后來讀者再學習錯誤的知識.謝謝!

    本文中所有程序均在DOSBox下使用MASM, LINK編譯運行

    簡單程序

    • segment…ends: 偽指令, 用來定義一個段(比如,代碼段,數據段,堆棧段), segment 標識一個段的開始, ends 標識一個段的結束.
    • 語法:
      SegmentName segment
      ..
      SegmentName ends

    • assume: 偽指令, 它假設某一段寄存器和程序中的某一個用 segment..ends 定義的段相關聯.


    • mov ax, 4c00h
      int 21h

      稱為程序返回,它的作用是將 CPU 的控制權交還給使他得以運行的程序.
    • 使用段

      使用 assume 將我們定義的數據段,堆棧段,代碼段和對應的段寄存器關聯起來.

      cs 寄存器對應代碼段
      ds 寄存器對應數據段
      ss 寄存器對應堆棧段

      值得注意, 我們在訪問數據段或者堆棧段的時候,總是將段基址先保存在 ax 中,然后由 ax 保存到 ds 或者 ss. 為什么不直接將段基址保存到 ds 或者 ss 中? 答案是該操作非法.

      簡單字符串處理程序

      在這里, 我們使用 bx + offset 的語法訪問數據段中的字符串. 相應的字符的地址計算方法為 addr=ds?16+bx+offsetaddr=ds?16+bx+offset.

      這里 offset 一般為常量. 如果不是常量, 我們可以使用 [bx+di+offset] 來完成. 相應的字符的地址計算方法為 addr=ds?16+bx+di+offsetaddr=ds?16+bx+di+offset.
      對于棧的訪問可以使用 [bx+si+offset] 的方式訪問. 相應的字符的地址計算方法為 addr=ds?16+bx+si+offsetaddr=ds?16+bx+si+offset.

      使用 bx, si, di, bp 寄存器尋址

    • 只有這四個寄存器可以用在 ‘[…]’ 中來進行內存單元尋址
    • 比如:
      mov ax, [bx]
      mov ax, [bx+si]
      mov ax, [bx+di]
      可以使用 bp 替換 bx.

      //以下用法是錯誤的
      mov ax, [ax]
      mov ax, [cx]
      mov ax, [dx]
      mov ax, [ds]

    • 這四個寄存次可以單個出現在 ‘[…]’ 中或者以組合出現.
    • 組合形式只能是以下四種:

      mov ax, [bx + si + offset]
      mov ax, [bx + di + offset]
      mov ax, [bp + si + offset]
      mov ax, [bp + si + offset]
      當然 offset 可以為零.

      //以下用法是錯誤的
      move ax, [di + si]
      move ax, [bx + bp]

    • 只要在 ‘[…]’ 中使用 bp 寄存器, 而指令中沒有顯式的給出段地址, 段地址默認在 ss 中.
    • 尋址方法

    • 直接尋址
    • 如: mov ax, [0] // 段基址在 ds 中

    • 寄存器間接尋址
    • 如:
      mov ax, [bx] // 段基址在 ds 中. bx 指明偏移
      mov ax, [si] // 段基址在 ds 中. si 指明偏移
      mov ax, [di] // 段基址在 ds 中. di 指明偏移
      mov ax, [bp] // 段基址在 ss 中. bp 指明偏移

    • 寄存器相對尋址
    • 如:
      mov ax, [bx+offset] // 段基址在 ds 中. bx+offset 指明偏移
      mov ax, [si+offset] // 段基址在 ds 中. si+offset 指明偏移
      mov ax, [di+offset] // 段基址在 ds 中. di+offset 指明偏移
      mov ax, [bp+offset] // 段基址在 ss 中. bp+offset 指明偏移

    • 基址變址尋址
    • 如:
      mov ax, [bx+si] // 段基址在 ds 中. bx+si 指明偏移
      mov ax, [bx+di] // 段基址在 ds 中. bx+di 指明偏移
      mov ax, [bp+si] // 段基址在 ss 中. bp+si 指明偏移
      mov ax, [bp+di] // 段基址在 ss 中. bp+di 指明偏移

    • 相對基址變址尋址
    • 如:
      mov ax, [bx+si+offset] // 段基址在 ds 中. bx+si+offset 指明偏移
      mov ax, [bx+di+offset] // 段基址在 ds 中. bx+di+offset 指明偏移
      mov ax, [bp+si+offset] // 段基址在 ss 中. bp+si+offset 指明偏移
      mov ax, [bp+di+offset] // 段基址在 ss 中. bp+di+offset 指明偏移

      指明數據長度

    • 通過寄存器名指明要處理的數據的尺寸
    • // 使用字長度 (ax: 16bit)
      mov ax, 1
      mov ds:[0], ax

      // 使用字節長度 (al: 8bit)
      mov al, 1
      mov ds:[0], al

    • 在沒有寄存器名存在的情況下, 使用操作符 Type ptr 指明內存單元長度. Type 可以使 word 或者 byte.
    • // 使用字長度 (ax: 16bit)
      mov word ptr ds:[0], 1
      add word ptr [bx], 1

      // 使用字節長度 (al: 8bit)
      mov byte ptr ds:[0], 1
      add byte ptr [bx], 1

    • 有些指令有默認的訪問數據長度. 比如 push 就只能進行字操作
    • div指令

      注意問題:

    • 除數: 有 8 位和 16 位兩種, 在一個 reg 或者內存單元中
    • 被除數: 默認放在 AX 或者 DX 和 AX 中, 如果除數為 8 位, 被除數則為 16 位, 默認在 AX 中; 如果除數為 16 位, 被除數則為 32 位, 在 DX 和 AX 中存放, DX 存放高 16 位, AX 存放低 16 位.
    • 結果: 如果除數為 8 位, 則 AL 存放除法操作的商, AH 存放余數; 如果除數為 16 位, 則 AX 存放除法操作的商, DX 存放余數;
    • 歡迎交流任何想法.

      End…

    總結

    以上是生活随笔為你收集整理的汇编语言笔记(一):基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。