偽操作

發(fā)布時間:2023-09-15
偽操作是匯編程序?qū)υ闯绦蜻M行匯編時處理的操作,(不像機器指令那樣是程序運行期間由計算機來執(zhí)行的)完成處理器選擇、存儲模式定義、數(shù)據(jù)定義、存儲器分配、指示程序開始結(jié)束等功能。
硬指令——使 cpu 產(chǎn)生動作、并在程序運行期間由計算機執(zhí)行的語句。
偽指令( directive )——不產(chǎn)生 cpu 動作、在程序執(zhí)行前由匯編程序處理的說明性語句。例如,數(shù)據(jù)說明、變量定義等等。
偽指令與具體的處理器類型無關,但與匯編程序的版本有關。
匯編語言語句實例
mov cx,0 ; 傳送指令,具有 2 個操作數(shù)
delay: nop ; 空操作指令,沒有操作數(shù),帶有標號
loop delay; 循環(huán)指令,標號 delay 說明轉(zhuǎn)移位置
buffer db 1,2,3,4,5,6,7 ;數(shù)據(jù)定義偽指令,在主存中開辟 7 個連續(xù)的字節(jié)單元,初值依次為 1 ~ 7 , buffer 表示首地址
1. 完整的段定義偽操作
存儲器的物理地址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標程序時,必須確定標號和變量的偏移地址,并且需要把有關信息通過目標模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起,形成一個可執(zhí)行程序。為此需要用段定義偽操作,格式如下:
段名 segment [ 定位 ] [ 組合 ] [ 使用 ] [' 類別 ' ]
... ; 對數(shù)據(jù)段 , 附加段和堆棧段 , 一般是存儲單元的定
... ; 義 , 分配等偽操作,對代碼段則是指令及偽操作.
段名 ends
完整段定義由 segment 和 ends 這一對偽指令實現(xiàn), segment 偽指令定義一個邏輯段的開始, ends 偽指令表示一個段的結(jié)束
段定義指令后的 4 個關鍵字用于確定段的各種屬性,堆棧段要采用 stack 組合類型,代碼段應具有‘ code '類別,其他為可選屬性參數(shù)
如果不指定,則采用默認參數(shù);但如果指定,注意要按照上列次序。
(1) 定位類型:指定邏輯段在主存儲器中的邊界,可為:
byte 該段可以從任何地址開始,這樣偏移地址可能不是 0
word 該段必須從字的邊界開始,即段起始地址必須為偶數(shù)
dword 該段必須從雙字的邊界開始,即段起始地址的最低兩個十六進制數(shù)位
須為 4 的倍數(shù)
para 該段的起始地址必須從小段邊界開始,即段起始地址的最低 16 進制數(shù)必須為 0
page 該段必須從頁的邊界開始,即段的起始地址的最低兩個十六進制數(shù)位必須為 0
簡化段定義偽指令的代碼和數(shù)據(jù)段默認采用 word 定位,堆棧段默認采用 para 定位
完整段定義偽指令的默認定位屬性是 para ,其低 4 位已經(jīng)是 0 ,所以默認情況下數(shù)據(jù)段的偏移地址從 0 開始 (2) 組合類型說明程序連接時的段合并方法,即指定多個邏輯段之間的關系,可為:
private 本段為私有段,與其他段沒有邏輯關系,在連接時不與其他段合并,每段都有自己的段地址。這是完整段定義偽指令默認的段組合方式
public 連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些段指定一個共同的段地址,也就是合成一個物理段。這是簡化段定義偽指令默認的段組合
stack 本段是堆棧的一部分,連接程序?qū)⑺?stack 段按照與 public 段的同樣方式進行合并。這是堆棧段必須具有的段組合
(3)使用類型是支持 32 位段而設置的屬性,用來說明使用 16 位尋址方式還是 32 位尋址方式
對于 16 位 x86 cpu 來說,它默認是 16 位段,即 use16
而對于匯編 32 位 x86 cpu 指令時,它默認采用 32 位段,即 use32 ;但可以使用 use16 指定標準的 16 位段
編寫運行于實地址方式( 8086 工作方式)的匯編語言程序,必須采用 16 位段
(4) 類別在引號中給出連接時組成段組的類型名。當連接程序組織段時,并不能把相同類別的段合并起來,但可將所有的同類別段相鄰分配
段類別可以是任意名稱,但必須位于單引號中
大多數(shù) masm 程序使用 'code' 、 'data' 和 'stack '來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)
此外,必須明確段與段寄存器的關系,可用 assume 偽操作來實現(xiàn)。格式:
assume 段寄存器:段名 [, 段寄存器名:段名 , ...]
作用 : 通知 masm 用指定的段寄存器來尋址對應的邏輯段,即建立段寄存器與段的缺省關系,在明確了程序中各段與段寄存器之間的關系后,匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段,在需要時自動插入段超越前綴。這是 assume 偽指令的主要功能。
assume 偽指令并不為段寄存器設定初值,所以在代碼段中還必須把段地址裝入相應的段寄存器中。例如:定義數(shù)據(jù)段段名為 data ,則需使用 mov 指令對 ds 段寄存器進行賦值。
mov ax, data
mov ds, ax
如果程序中有堆棧段,也需要把地址裝入 ss 中
代碼段不需要這樣做,代碼段的這一操作是在程序初始化時完成的。
例:完整的段定義偽操作
data_1 segment

data_1 ends
data_2 segment

data_2 ends
code segment
assume cs:code,ds:data_1,es:data_2
start:
mov ax,data_1
mov ds,ax
mov ax,data_2
mov es,ax

code ends
end start
2. 存儲模型與簡化段定義偽操作
(1)model 偽操作
格式: .model memory_model[,model options]
用來表明存儲模型,即用來說明在存儲器中是如何安放各個段的.
存儲模型 memory model 決定一個程序的規(guī)模,確定進行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性
masm 有 7 種不同的存儲模式:
① tiny ② small
③ compact ④ medium
⑤ large ⑥ huge
⑦ flat
微型模型是 masm 6.0 才引入的,用于創(chuàng)建 com 類型程序。用微型模型編寫匯編語言程序時,所有的段地址寄存器都被設置為同一值,這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個段內(nèi),不大于 64kb ;訪問操作數(shù)或指令都只需要使用 16 位偏移地址。一般用于小程序。
s mall 小型模型是最常用的一種模型。在小型模型下,一個程序至多只能有一個代碼段和一個數(shù)據(jù)段,每段不大于 64kb ,這里的數(shù)據(jù)段指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個段基址,總長度不超過 64kb ;訪問操作數(shù)或指令都只需要使用 16 位偏移地址;代碼和數(shù)據(jù)都是近訪問的,小模型下程序的最大長度為 128kb
c ompact 緊湊模型適合于數(shù)據(jù)量大但代碼量小的程序。在該模型下,代碼段被限制在一個不大于 64kb 的段內(nèi);而數(shù)據(jù)段則可以有多個,超過 64kb ?!〈a是近訪問的,而數(shù)據(jù)則可為遠訪問的。m edium 中型模型是與緊湊模型互補的模型,適合于數(shù)據(jù)量小但代碼量大的程序。中型模式的代碼段可以超過 64kb ,有多個;但數(shù)據(jù)段只能有一個不大于 64kb 的段。數(shù)據(jù)是近訪問,而代碼可遠訪問。
l arge 大型模式允許的代碼段和數(shù)據(jù)段都有多個,都可以超過 64kb ;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在 64k 字節(jié)內(nèi) . 數(shù)據(jù)和代碼都可以遠訪問。
h uge 巨型模型與大型模型基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在 64k 字節(jié)之內(nèi)
f lat 平展模型用于創(chuàng)建一個 32 位的程序,它只能運行在 32 位 x86 cpu 上。 dos 下不能使用 flat 模型,而編寫 32 位 windows 9.x 或 windows-nt 的程序時,必須采用 flat 模型。
dos 下編程可選擇前六種模型,一般可以選用 small 模型, tiny 模式產(chǎn)生 com 程序,其他模型產(chǎn)生 exe 程序, flat 模型只能用于 32 位程序。
model options 允許用戶指定三種選項:高級語言接口、操作系統(tǒng)和堆棧距離。
  高級語言接口選項是指該匯編語言程序作為某一種高級語言程序的過程而為該高級語言程序調(diào)用時,應該用c等來說明。
  操作系統(tǒng)選項是要說明程序運行于哪個操作系統(tǒng)之下,可用 os_dos 或 os_os2 來說明,默認是 os_dos 。
  堆棧距離選項可用 nearstack 或 farstack 來說明,基中 nearstack 是指堆棧段和數(shù)據(jù)段組合到一個 dgroup 段中,而 farstack 是指堆棧段和數(shù)據(jù)段并不合并。
  例如: .model small,c
.model large,os_dos
上一個:電腦顯示屏開機慢怎么回事(電腦開機慢是主機問題還是顯示器問題)
下一個:安卓手機可以在電腦上投屏嗎(安卓手機能投屏到筆記本上面嗎)

碧桃霉斑穿孔病如何防治
windows7玩lol掉幀(win7玩lol間歇性掉幀卡頓)
雪后寒冬教你如何沖泡普洱茶熟茶
梁鋼筋下料長度計算(實例)?
固態(tài)鋰電池公司排名榜,求國內(nèi)鋰電池和鎳電池PACK電池生產(chǎn)企業(yè)名錄最好有排名謝謝
如何能讓金蓮花能夠常年開花
茶雕五大特點
百香果病毒病分為幾種,百香果常見的病毒病有哪些?
全球最頂級香水品牌(全球十大奢侈香水品牌價格)
RC0603DR-075K49L,0603 5.49KΩ 0.5% 1/10W 電阻
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos