Assembly Language Course

46  Download (0)

Full text

(1)

Assembly Language Course Ref. Irvine, Assembly Language For INTEL-based

Computers, 5e, Pearson.

(2)

 三個基本操作模式

保護模式(Protected Mode)

實體位址模式(Real-address Mode)

系統管理模式(System Management Mode; SMM)

(3)

 預設模式

所有指令與功能皆可使用。

每個被執行的程式(行程)都被分配有各自4GB的記憶體空 間(稱區段, segments)。

不能參考到被指派使用之區段外的記憶體。

 可以同時執行多個程式。

 特殊情況

虛擬8086模式(Virtual-8086 Mode)

模擬一個8086機器。

在安全的多工環境內,直接執行實體位址模式軟體。

要直接接觸到硬體的軟體不能在此模式執行。

配置1MB位址空間。

(4)

 一次只能執行一個程式,但處理器可以藉由中斷信 號中斷正在執行的程式。

 在此模式可以實作出Intel 8086處理器的程式執行 環境。

 可切換到其他模式。

 Window 98中可使用此模式。

 可用於執行一個需要直接存取系統記憶體或硬體裝 置的MS-DOS程式。

 在實體模式下執行的程式,可能導致作業系統當機。

 可任何存取1MB位址空間(0x00000~0xFFFFF)內 資料。

(5)

 提供作業系統額外的機制,用於增加如電源管理和 系統安全等功能。

(6)

 位址空間

保護模式:可存取4GB(22×230Bytes)的記憶體範圍。

實體位址模式:可存取1MB(1×220Bytes)的記憶體範圍。

保護模式下的虛擬8086模式:多個執行的程式中的每個 可分別擁有1MB(1×220Bytes)的記憶體存取範圍。

(7)

 基本的程式執行暫存器(Basic program execution registers)

通用暫存器:8個

32 bits: EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI

區段暫存器:6個

16 bits: CS, SS, DS, ES, FS, GS

旗標暫存器:1個

32 bits: EFLAGS

指令指標:1個

32 bits: EIP

(8)

 General-Purpose Registers

 主要用於算術與資料搬移。

 每個暫存器都可被定址為單一個32或16位元的值。

 部分暫存器可定址為8位元的值。

(9)

bits32 16

bits 8 bits

(High) 8 bits

(Low) 備註

EAX AX AH AL 乘法/除法自動使用EAX Extended Accumulator EBX BX BH BL

ECX CX CH CL 迴圈計數器自動使用ECX EDX DX DH DL

ESI SI - - 常用於高速的記憶體轉移指

令 (來源) Extended Source Index

EDI DI - - 常用於高速的記憶體轉移指

令 (目地) Extended

Destination Index

EBP BP - -

高階語言常用EBP來參照堆疊 中的函數參與與局部變數。

不建議使用此暫存器於平常 的算術運算與資料搬移。

ESP SP - - 堆疊定址使用ESP Extended Stack Pointer

(10)

 Segment Registers

 實體模式:

用於定義區段的基底位址。

區段:預先指定的記憶體區域。

 保護模式:

用於儲存指向區段描述符表的指標。

 區段常見的用途:

儲存程式碼的區段。

儲存變數(資料)的區段。

儲存堆疊內容的區段。

局部變數/函數參數。

(11)

 Instruction Pointer, EIP

 儲存下一個即將執行的指令位址。

(12)

 或稱旗標(Flags)暫存器。

 由各別獨立的二進位位元所組成。

稱為旗標(flag)

用於

控制CPU運作(控制旗標,Control Flags),

或顯露某些運算的結果(狀態旗標,Status Flags)。

旗標

設定(set):1

清除(clear)/重置(reset):0

(13)

 進位旗標(Carry Flag, CF)

 溢位旗標(Overflow Flag, OF)

 符號旗標(Sign Flag, SF)

 零值旗標(Zero Flag, ZF)

 輔助進位旗標(Auxiliary Carry Flag, AC)

 同位旗標(Parity Flag, PF)

(14)

 在無號數算術運算結果的值大於目地位址所能儲存 的值時,會被設定。

 例如:

若目的位址能儲存32位元的值,當執行232+1的運算時,

CF會被設定為1。

(15)

 在有號數算術運算結果的值大於或小於目地位址儲 存空間所能表示的值時,會被設定。

 例如:

若目的位址能儲存的值範圍在-231~231-1的值,當執行 x+1, where x=(231-1)的運算時,OF會被設定為1。

(16)

 當算術或邏輯運算後產生負值的結果時,會被設定。

 例如:

執行3-5的運算後。

(17)

 當算術或邏輯運算後產生零值的結果時,會被設定。

 例如:

執行3-3的運算後。

(18)

 當一個8位元運算元在算術運算中,其位元三(bit 3) 有進位到位元四(bit 4)時,此旗標會被設定。

 例如:

執行00001011b+00001001b時。

(19)

如果在結果中的最小有效位元組含有偶數個1的位 元數,則此旗標會被設定,否則會被清除。

奇同位。

(20)

應用程式通常不應該存取此類暫存器。

例如,Windows系統只允許level 0(最高級)程式,像是kernel 程式,存取此類暫存器。

IDTR ,中斷描述符表暫存器。

Interrupt Descriptor Table Register

GDTR ,全域描述符表暫存器。

Global Descriptor Table Register

LDTR,局部描述符表暫存器。

Local Descriptor Table Register

Task Register,任務暫存器。

Debug Registers,除錯暫存器。

Control Registers,控制暫存器。

Model-Specific Registers,特定模型暫存器。

(21)

 內含中斷描述符表的位址。

中斷描述符表,

提供中段處理常式的起始位址。

(22)

 儲存全域描述符表的位址

 全域描述符表

含有指向任務狀態區段(task state segments)和指向區域 程式描述符表(local program descriptor tables)的指標。

(23)

 The register contains pointers

to the code, data, and stack

of currently running programs.

(24)

 The register contains the address

of the TSS (task state segment)

for the currently executing task.

(25)

 The registers let programs set breakpoints when debugging programs.

(26)

 CR0, CR2, CR3, CR4

 The registers contain

status flags

and data fields

that control system-level operations

such as

 task switching,

 paging,

 and enabling cache memory.

 (Register CR1 is not used)

(27)

 The registers are used for such operating

system tasks as performance monitoring and checking the machine architecture.

 Their use varies among different IA-32 processors.

(28)

用於執行高速的浮點算術。

此單元擁有

八個浮點資料暫存器(Floating-Point Registers):

ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7)

80 bits

兩個指標暫存器(Pointer Registers):

FPU Instruction Pointer, FPU Data Pointer

48 bits

三個控制暫存器(Control Registers):

Tag Register, Control Register, Status Register

16 bits

一個操作碼暫存器

Opcode Register, 80-bit.

(29)

 於進階多媒體程式設計中可使用:

8個額外的64-bit暫存器

可供MMX指令集使用。

8個額外的128-bit XMM暫存器

可於SIMD(Single Instruction, multiple data)操作時使用。

(30)

參考P48, 1~11題 (P38-39, 1~11)

(31)

 記憶體管理依據三種基本模式。

實體模式

只能定址1MB的記憶體空間(0x00000~0xFFFFF)

處理器一次只能執行一個程式。(可被中斷信號中斷)

MS-DOS作業系統在此模式執行

Window 95, 98可以啟動進入此模式。

保護模式

能同時執行多個程式,每個行程(執行中程式)可分配到4GB的 記憶體。

每個程式可以分配到自己所屬的記憶體區域,避免意外地存 取到其他程式的程式碼與資料。

MS-Windows, Linux

(32)

 虛擬8086模式

也是在保護模式中執行,但是會建立一個虛擬的8086機 器。

此機器擁有:自己的1MB位址空間。

 可參考資料

Intel IA-32 架構軟體開發者手冊 (IA-32 Intel Architecture Software Developer’s Manual)

http://www.intel.com

(33)

記憶體位址分兩部分描述

區段基底位址

有效位址(EA)

實體模式

實際位址(PA) = 區段基底位址 + 有效位址

區段基底位址:8086, 80286: 存放於區段暫存器內的值乘上10h。

有效位址:透過指令中各種定址方式獲得。

保護模式(在80386之後),

線性位址(LA) = 區段基底位址(32bit) + 有效位址(32bit)

區段基底位址:透過區段描述符中的基底位址欄位獲得

有效位址:透過指令中各種定址方式獲得。

實際位址(PA):線性位址透過 “記憶體映成單元” 的處理,才能產生。

(34)

可用20 bits存取記憶體

20 bits -> 1,048,576 bytes; 0x00000~0xFFFFF

因為8086只有16bits暫存器,

使用區段記憶體架構來建構出20bits的位址值。(透過MMU硬體 電路)

將記憶體空間分成區段(segments),

 每個區段64-kilobyte大小。

在每個區段內,透過偏移值(offset)定址到欲指定的記憶體位置。

 絕對(線性)位址 = 區段位址 + 偏移值

區段位址只用16位元的4個位數來表示:

 例如區段起始位址在0x12340處,用0x1234表示

 其被存放於CS, DS, SS, ES這些暫存器內。

所以線性位址0x12345用1234:0005表示。

(35)

 若在實體模式下,某變數的位址為08F1:0100,則 其線性位址為何?

(36)

 若在實體模式下,某變數的位址為08F1:0100,則 其線性位址為何?

 ANS.:

線性位址

=08F1h*10h+0100h=08F10h+0100h=09010h

(37)

 定址範圍4GB

0x0000,0000~0xFFFF,FFFF

在Microsoft Assembler中的flat memory model(平直記憶 體模式)很適合用於表示保護模式下的記憶體位址。

記憶體位址只用單一個32位元整數表示。

區段

透過區段暫存器所指向的區段描述符表(Segment Descriptor Tables)內的資訊,計算得知區段所在。

可使用的區段暫存器:CS,DS, ES, SS, FS, FS

保護模式下常用的三個區段

CS: 指向程式碼區段的描述符表。

DS: 指向資料區段的描述符表。

SS: 指向堆疊區段的描述符表。

(38)

 一個位址直接用32bits表示

 需要至少用到兩個區段

一個給程式碼使用

一個給資料使用

 一個區段描述符(segment descriptor)

可定義出一個區段。

64 bits整數。

存放於全域描述符表(Global Descriptor Table, GDT)內。

(39)

 64 bits

基底位址(32 bits) 區段極限 存取

0000,0000 0040 ----

0004,0000h

0000,0000h 4000,0000h

4GB

範圍 區段極限值*1000h

(40)

 若要指定區段的大小為256MB,且區段起始於位址 0000,0000h則區段描述符的基底欄位值與區段極 限應該為何?

(41)

 若要指定區段的大小為256MB,且區段起始於位址 0000,0000h則區段描述符的基底欄位值與區段極 限值應該為何?

 Ans.:

256MB:有28x220個位址: 需要28 bits表示。

000,0000h~FFF,FFFFh

所以

基底為0000,0000h

區段極限為10000h

(42)

 在此模式,每個程式擁有自己的區段描述符表,稱 為區域描述符表(Local Descriptor Table, LDT)。

每個描述符指向一個區段(Segment)。

每個區段有自己的記憶體空間

內含區段大小資料

 例如:

起始於位址3000h具有2000h大小的區段,

則描述符中

基底位址為00003000h,

極限值為0002 (因為 0002h*1000h=2000h)

(43)

節區段記憶體管理單元(segmentation memory

management unit)內的分頁記憶體管理單元(paging memory management unit)提供分頁功能。

可由控制暫存器控制啟動與否。

將記憶體區段分割成數個區塊,稱為頁面(pages)

每個頁:4096bytes(4kbytes)

透過此技術

可讓同一時間執行的全部程式,使用的記憶體總合大於電腦的 實體記憶體

作業系統映射的所有頁面總合稱為

虛擬記憶體(virtual memory)

作業系統通常會透過稱為“虛擬記憶體管理員”管理之。

(44)

 有三個主要的組成單元

頁區目錄(page directory)

4k Bytes

內含條目(entries)

 4 Bytes / entry

 用於指定一個分頁表的基底位址與相關存取資訊。

分頁表(page table)

4k Bytes

內含條目(entries)

 4 Bytes / entry

 用於指定一個頁區(頁面)的基底位址與相關存取資訊。

頁區(page) (頁面)

4k Bytes

(45)

80386CPU的線性位址對實際位址的轉換

頁區目錄 分頁表 位移位址

根目錄 CR0

CR1 CR2 CR3

控制暫存器

運算元

記憶體 頁區目錄

分頁表

(使用4k頁區時) 使用者記憶體 +

+

+ 線性位址

(46)

 模式與位址空間

 位址空間

 有效/線性/實際位址

 上述三者關係

Figure

Updating...

References

Related subjects :