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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

汇编语言全览教程

發布時間:2023/12/3 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 汇编语言全览教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎知識

機器語言

機器語言是 011 組成的,能直接對 CPU 發送指令的語言。早期程序員通過卡片打孔控制機器。這樣的程序難以編輯。

匯編語言的產生

匯編語言和機器語言是逐行一一對應的。例如:

  • 操作:寄存器BX內容放進AX
  • 機器:1000100111011000
  • 匯編:mov ax, bx

寄存器就是 CPU 中可以存儲數據的原件, AX 和 BX 都是寄存器代號。

匯編語言需要通過編譯器轉換成機器碼。

匯編語言的組成

  1. 匯編指令:實際的操作指令,直接轉換成機器碼
  2. 偽指令:類似 C 中的 #define, 沒有對應的機器碼,編譯器負責執行
  3. 其他符號:例如 + - * /

存儲器

就是內存,存儲指令和數據。

指令和數據

在內存或者磁盤上都是一樣的二進制編碼,根據馮諾依曼結構,有的看做指令,有的看做數據。

例如

  • 內容:1000100111011000
  • 數據:89D8H
  • 程序:mov ax, bx

存儲單元

從 0 開始編號, 8bit = 1byte 。

CPU 對存儲器的讀寫

需要提供以下信息:

  • 存儲單元的地址信息
  • 讀寫、器件的控制信息
  • 數據信息

通過總線傳遞數據。

地址總線

其寬度決定了能發送的地址位長度。

數據總線

同理,一次傳輸總線寬度位。

控制總線

CPU 能發送的對器件的控制代碼。

內存地址空間

CPU 的地址總線寬度為 10 ,可以尋址 1024 個內存單元,這就對應內存地址空間。

可以把后面提到的各種存儲器都看做同一個邏輯存儲器。把地址段不同部分分配給不同的器件。

主板

通過總線和插槽鏈接器件。

接口卡

CPU 可以發送控制和數據讀寫命令。如顯卡。

存儲器芯片

  • 隨機存儲器
  • BIOS 和 ROM
  • 接口卡上的 RAM

寄存器

功能:

  • 運算器處理信息
  • 寄存器存儲信息
  • 控制器控制器件
  • 內部總線傳輸數據

8086 有 14 個寄存器,分別是 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 。

通用寄存器

有 AX BX CX DX ,分別有 16 位,可以分開當 AH AL 這樣的高低位使用,互不影響。

字在寄存器中的存儲

一個字 Word 16 位 = 兩個字節 Byte 8 位。

一些匯編指令

  • 匯編 mox ax, 18 高級語言 AX=18
  • 匯編 add ax, 8 高級語言 AX = AX+8
  • 匯編 add ax, bx 高級語言 AX=AX+BX

物理地址

需要通過邏輯地址計算得出

16位結構CPU

8086 是 16 位的,特點:

  • 運算器一次出處理 16 位數據
  • 寄存器最大寬度 16 位
  • 寄存器、運算器通路 16 位

8086 得到物理地址

有 20 位地址總線,1MB尋址能力,但是內部能處理的地址只有16位。但是可以合成20位地址。

  • 提供段地址和偏移地址
  • 利用地址加法器相加

準確的說,物理地址=段地址x16+偏移地址。

段的概念

內存并沒有分段,但是 CPU 做了分段。但是分段可以是任意自己制定的。

段寄存器

CS DS SS ES

CS和 IP

CS 是代碼段寄存器, IP 是指令指針寄存器,任意時刻執行的代碼就是 CS:IP 。

修改CS和IP的指令

不能夠直接 mov 修改,如果同時修改用
JMP 段地址:偏移地址 ,只修改 IP 的話用 JMP 某個寄存器

代碼段

代碼會被自動存入內存,但是并不會被 CPU 自動識別為指令而非數據,所以需要 JMP 跳到代碼段開頭。

寄存器

內存中字存儲

字單元 DWORDL兩個連續的內存單元,高地址存高位,低地址存地位。例如數據 20000 = 4E20H , 0 位存 20H (低), 1 位存 4EH (高)。

DS 和[address]

DS 通常存要訪問的數據的段地址。

mov bx, 1000H     ; ds 是不能直接放入數據的,所以要用 bx 中轉。
mov ds, bx        ; 段地址
mov al, [0]       ; [0]默認是基于ds的偏移,所以實際上代表 1000:0 位置。

字的傳送

只要目標是 16 位就行。

mov add sub 指令

mov 寄存器 數據/寄存器/內存單元
mov 內存單元/段寄存器 寄存器

記住何時需要寄存器中轉即可。

數據段

用 ds 存放數據段段地址, 用 [] 縮寫訪問偏移。

CPU 提供的棧機制

SS:SP 指向棧頂, SS 指向棧。

PUSH AX 進, POP AX 出。

例如,初始狀態 SS=1000H , SP=0020H, SS:SP=10020H 也就是棧底。 PUSH 8 次字 (占位置 16 字節, 10H 個位置) 后, SS:SP=10010H 。

8086 沒有保證棧不超界的設計。

第一個程序

源碼從寫出到執行

  1. 編寫代碼
  2. 編譯連接:可執行文件包括描述信息和程序本身
  3. 執行

源程序

assume cs:codeseg       ; 關聯寄存器和代碼段
codesg segement         ; 定義語句段...mov ax,4c00Hint 21H              ; 程序返回
codeseg ends
end

編譯和連接

根據具體使用IDE而定。

BX 和 loop 指令

總結

以上是生活随笔為你收集整理的汇编语言全览教程的全部內容,希望文章能夠幫你解決所遇到的問題。

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