偽操作

發(fā)布時(shí)間:2023-09-15
偽操作是匯編程序?qū)υ闯绦蜻M(jìn)行匯編時(shí)處理的操作,(不像機(jī)器指令那樣是程序運(yùn)行期間由計(jì)算機(jī)來執(zhí)行的)完成處理器選擇、存儲(chǔ)模式定義、數(shù)據(jù)定義、存儲(chǔ)器分配、指示程序開始結(jié)束等功能。
硬指令——使 cpu 產(chǎn)生動(dòng)作、并在程序運(yùn)行期間由計(jì)算機(jī)執(zhí)行的語句。
偽指令( directive )——不產(chǎn)生 cpu 動(dòng)作、在程序執(zhí)行前由匯編程序處理的說明性語句。例如,數(shù)據(jù)說明、變量定義等等。
偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)。
匯編語言語句實(shí)例
mov cx,0 ; 傳送指令,具有 2 個(gè)操作數(shù)
delay: nop ; 空操作指令,沒有操作數(shù),帶有標(biāo)號(hào)
loop delay; 循環(huán)指令,標(biāo)號(hào) delay 說明轉(zhuǎn)移位置
buffer db 1,2,3,4,5,6,7 ;數(shù)據(jù)定義偽指令,在主存中開辟 7 個(gè)連續(xù)的字節(jié)單元,初值依次為 1 ~ 7 , buffer 表示首地址
1. 完整的段定義偽操作
存儲(chǔ)器的物理地址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標(biāo)程序時(shí),必須確定標(biāo)號(hào)和變量的偏移地址,并且需要把有關(guān)信息通過目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起,形成一個(gè)可執(zhí)行程序。為此需要用段定義偽操作,格式如下:
段名 segment [ 定位 ] [ 組合 ] [ 使用 ] [' 類別 ' ]
... ; 對數(shù)據(jù)段 , 附加段和堆棧段 , 一般是存儲(chǔ)單元的定
... ; 義 , 分配等偽操作,對代碼段則是指令及偽操作.
段名 ends
完整段定義由 segment 和 ends 這一對偽指令實(shí)現(xiàn), segment 偽指令定義一個(gè)邏輯段的開始, ends 偽指令表示一個(gè)段的結(jié)束
段定義指令后的 4 個(gè)關(guān)鍵字用于確定段的各種屬性,堆棧段要采用 stack 組合類型,代碼段應(yīng)具有‘ code '類別,其他為可選屬性參數(shù)
如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序。
(1) 定位類型:指定邏輯段在主存儲(chǔ)器中的邊界,可為:
byte 該段可以從任何地址開始,這樣偏移地址可能不是 0
word 該段必須從字的邊界開始,即段起始地址必須為偶數(shù)
dword 該段必須從雙字的邊界開始,即段起始地址的最低兩個(gè)十六進(jìn)制數(shù)位
須為 4 的倍數(shù)
para 該段的起始地址必須從小段邊界開始,即段起始地址的最低 16 進(jìn)制數(shù)必須為 0
page 該段必須從頁的邊界開始,即段的起始地址的最低兩個(gè)十六進(jìn)制數(shù)位必須為 0
簡化段定義偽指令的代碼和數(shù)據(jù)段默認(rèn)采用 word 定位,堆棧段默認(rèn)采用 para 定位
完整段定義偽指令的默認(rèn)定位屬性是 para ,其低 4 位已經(jīng)是 0 ,所以默認(rèn)情況下數(shù)據(jù)段的偏移地址從 0 開始 (2) 組合類型說明程序連接時(shí)的段合并方法,即指定多個(gè)邏輯段之間的關(guān)系,可為:
private 本段為私有段,與其他段沒有邏輯關(guān)系,在連接時(shí)不與其他段合并,每段都有自己的段地址。這是完整段定義偽指令默認(rèn)的段組合方式
public 連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些段指定一個(gè)共同的段地址,也就是合成一個(gè)物理段。這是簡化段定義偽指令默認(rèn)的段組合
stack 本段是堆棧的一部分,連接程序?qū)⑺?stack 段按照與 public 段的同樣方式進(jìn)行合并。這是堆棧段必須具有的段組合
(3)使用類型是支持 32 位段而設(shè)置的屬性,用來說明使用 16 位尋址方式還是 32 位尋址方式
對于 16 位 x86 cpu 來說,它默認(rèn)是 16 位段,即 use16
而對于匯編 32 位 x86 cpu 指令時(shí),它默認(rèn)采用 32 位段,即 use32 ;但可以使用 use16 指定標(biāo)準(zhǔn)的 16 位段
編寫運(yùn)行于實(shí)地址方式( 8086 工作方式)的匯編語言程序,必須采用 16 位段
(4) 類別在引號(hào)中給出連接時(shí)組成段組的類型名。當(dāng)連接程序組織段時(shí),并不能把相同類別的段合并起來,但可將所有的同類別段相鄰分配
段類別可以是任意名稱,但必須位于單引號(hào)中
大多數(shù) masm 程序使用 'code' 、 'data' 和 'stack '來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)
此外,必須明確段與段寄存器的關(guān)系,可用 assume 偽操作來實(shí)現(xiàn)。格式:
assume 段寄存器:段名 [, 段寄存器名:段名 , ...]
作用 : 通知 masm 用指定的段寄存器來尋址對應(yīng)的邏輯段,即建立段寄存器與段的缺省關(guān)系,在明確了程序中各段與段寄存器之間的關(guān)系后,匯編程序會(huì)根據(jù)數(shù)據(jù)所在的邏輯段,在需要時(shí)自動(dòng)插入段超越前綴。這是 assume 偽指令的主要功能。
assume 偽指令并不為段寄存器設(shè)定初值,所以在代碼段中還必須把段地址裝入相應(yīng)的段寄存器中。例如:定義數(shù)據(jù)段段名為 data ,則需使用 mov 指令對 ds 段寄存器進(jìn)行賦值。
mov ax, data
mov ds, ax
如果程序中有堆棧段,也需要把地址裝入 ss 中
代碼段不需要這樣做,代碼段的這一操作是在程序初始化時(shí)完成的。
例:完整的段定義偽操作
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. 存儲(chǔ)模型與簡化段定義偽操作
(1)model 偽操作
格式: .model memory_model[,model options]
用來表明存儲(chǔ)模型,即用來說明在存儲(chǔ)器中是如何安放各個(gè)段的.
存儲(chǔ)模型 memory model 決定一個(gè)程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性
masm 有 7 種不同的存儲(chǔ)模式:
① tiny ② small
③ compact ④ medium
⑤ large ⑥ huge
⑦ flat
微型模型是 masm 6.0 才引入的,用于創(chuàng)建 com 類型程序。用微型模型編寫匯編語言程序時(shí),所有的段地址寄存器都被設(shè)置為同一值,這意味著代碼段、數(shù)據(jù)段、堆棧段都在同一個(gè)段內(nèi),不大于 64kb ;訪問操作數(shù)或指令都只需要使用 16 位偏移地址。一般用于小程序。
s mall 小型模型是最常用的一種模型。在小型模型下,一個(gè)程序至多只能有一個(gè)代碼段和一個(gè)數(shù)據(jù)段,每段不大于 64kb ,這里的數(shù)據(jù)段指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個(gè)段基址,總長度不超過 64kb ;訪問操作數(shù)或指令都只需要使用 16 位偏移地址;代碼和數(shù)據(jù)都是近訪問的,小模型下程序的最大長度為 128kb
c ompact 緊湊模型適合于數(shù)據(jù)量大但代碼量小的程序。在該模型下,代碼段被限制在一個(gè)不大于 64kb 的段內(nèi);而數(shù)據(jù)段則可以有多個(gè),超過 64kb ?!〈a是近訪問的,而數(shù)據(jù)則可為遠(yuǎn)訪問的。m edium 中型模型是與緊湊模型互補(bǔ)的模型,適合于數(shù)據(jù)量小但代碼量大的程序。中型模式的代碼段可以超過 64kb ,有多個(gè);但數(shù)據(jù)段只能有一個(gè)不大于 64kb 的段。數(shù)據(jù)是近訪問,而代碼可遠(yuǎn)訪問。
l arge 大型模式允許的代碼段和數(shù)據(jù)段都有多個(gè),都可以超過 64kb ;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在 64k 字節(jié)內(nèi) . 數(shù)據(jù)和代碼都可以遠(yuǎn)訪問。
h uge 巨型模型與大型模型基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在 64k 字節(jié)之內(nèi)
f lat 平展模型用于創(chuàng)建一個(gè) 32 位的程序,它只能運(yùn)行在 32 位 x86 cpu 上。 dos 下不能使用 flat 模型,而編寫 32 位 windows 9.x 或 windows-nt 的程序時(shí),必須采用 flat 模型。
dos 下編程可選擇前六種模型,一般可以選用 small 模型, tiny 模式產(chǎn)生 com 程序,其他模型產(chǎn)生 exe 程序, flat 模型只能用于 32 位程序。
model options 允許用戶指定三種選項(xiàng):高級語言接口、操作系統(tǒng)和堆棧距離。
  高級語言接口選項(xiàng)是指該匯編語言程序作為某一種高級語言程序的過程而為該高級語言程序調(diào)用時(shí),應(yīng)該用c等來說明。
  操作系統(tǒng)選項(xiàng)是要說明程序運(yùn)行于哪個(gè)操作系統(tǒng)之下,可用 os_dos 或 os_os2 來說明,默認(rèn)是 os_dos 。
  堆棧距離選項(xiàng)可用 nearstack 或 farstack 來說明,基中 nearstack 是指堆棧段和數(shù)據(jù)段組合到一個(gè) dgroup 段中,而 farstack 是指堆棧段和數(shù)據(jù)段并不合并。
  例如: .model small,c
.model large,os_dos
上一個(gè):電腦顯示屏開機(jī)慢怎么回事(電腦開機(jī)慢是主機(jī)問題還是顯示器問題)
下一個(gè):安卓手機(jī)可以在電腦上投屏嗎(安卓手機(jī)能投屏到筆記本上面嗎)

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