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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言程序格式

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言程序格式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 邏輯段

匯編語言源程序由一個或多個邏輯段組成。
? 一個程序中可以有幾個同一類型的邏輯段。
? 必須至少有一個代碼段。

[注]源程序分段的目的在于程序結構清晰、便
于內存分配,尋址方便,一個源程序需要設置
幾個段應根據具體問題來定。

段定義偽操作

段名 segment 定位 組合 段字 ‘類別’
… ;語句序列
段名 ends

  • 完整段定義由SEGMENT和ENDS這一對偽指令實現,
    SEGMENT偽指令定義一個邏輯段的開始,ENDS偽指令
    表示一個段的結束
  • 如果不指定,則采用默認參數;但如果指定,注
    意要按照上列次序
  • 段名對外表現為立即數,為該段的段地址

常數和數值表達式

常數(常量)表示一個固定的數值
(1)十進制常數: 以字母D或d結尾或缺省
(2)十六進制常數:以字母H或h結尾,以字
母A~F 開頭的十六進制數,前面要用0表達。
(3)二進制常數:由0或1兩個數字組成,以
字母B或b結尾
(4)八進制常數:以字母Q或q結尾
(5)字符串常數:字符的ASCII碼,如’abc’
(6)符號常數(常量),有點像#define出來的常量
?等價EQU偽指令
符號名 EQU 數值表達式
符號名 EQU <字符串>
?等號=偽指令
符號名 = 數值表達式
?=和EQU區別:
前者可多次使用,后者只能使用一次

數值表達式

  • 數值表達式——用常數、符號常數和算
    術、邏輯、關系運算符組成的表達式。
    如:(75*2+X)/Y
  • 匯編程序在匯編過程中計算,最終得到
    一個數值(常數)
  • 程序運行之前,就已經計算出了結果;
    所以,程序運行速度沒有變慢,但增強
    程序的可讀性

變量和標號

變量

? 變量——是指數據單元的符號地址。
? 變量的書寫格式:不能使用系統保留字、不能以數字開頭
? 變量的定義:用數據定義偽指令來定義

標號

? 標號——一個指令單元的符號地址。
? 標號的書寫格式:不能使用系統保留字、不能以數字
開頭
? 標號的定義:在一條指令語句前輸入標號且用“:”隔
開,即定義了該標號;或用Label來定義

變量定義偽指令

格式:
? [變量] DB/DW/DD/ DF / DQ / DT 操作數1,…,操作數n
功能:
? 定義變量;
? 在內存中分配一組存儲單元;
? 并對單元進行初始化。
分類
? DB:用來定義字節,其后每個操作數占用一個字節。
? DW:用來定義字,其后每個操作數占用一個字。
? DD:用來定義雙字,其后每個操作數占用兩個字。
? DQ:用來定義四個字,其后每個操作數占用四個字。
? DT:用來定義十個字節,其后每個操作數占用十個字節。

操作數

常數或一組常數或數值表達式;

? 例如:DATA DB 2, 100*2-5, 0, -1

一組字符串

? 如: STRING DB ‘This is a string’,其數值是每個字符對
應的ASCII碼的值
? 注意比較DB “ab”和 DW “ab”

變量名或標號名

? ADDR1 DW BLOCK ;BLOCK偏址放在
ADDR1單元
? ADDR2 DD BLOCK ;BLOCK的偏址和段
址依次存放在ADDR2四字節單元中。

一組“?”

? 只分配空間,不進行初始化
? 例如:BLOCK DW ?,? ;分配兩個字,但
為隨機值

重復DUP語句

? 格式:重復數 n DUP(重復內容)
? 功能:將DUP后的內容重復定義n
次。
? 例如:BLOCK DB 3 DUP (0,1,-1)
? 如同:BLOCK DB 0,1,-1, 0,1,-1,
0,1,-1

[注]DUP語句中可以包含DUP語
句。

起始地址和對準語句

ORG

? 格式:ORG 表達式
? 功能:指定隨后指令或者定義數據的偏移地址
? 說明:
?
“ORG”偽指令可設置程序段、數據段任何位置。
? 若程序中沒有設置“ORG”語句,一般情況每個邏
輯的起始地址為0000H。

EVEN

? 格式:EVEN
? 功能:偶地址對齊指令。若當前地址是奇數,
則加1;

上課講過這個的用途,什么尋址時偏移地址最后一位無效,兩個內存單元一起,然后有些字取一次就行有些要取兩次。我給整忘了

ALIGN

? 格式: ALIGN n
? 功能:使隨后的數據或者指令起始于n(2,4,8…)
的倍數地址

這個的原因和上面那個差不多,這個2的n次是有意義的。

NOTICE

匯編語言強類型!
變量有類型!
BUFFER DW 1234H
? MOV AL, BUFFER
? MOV AL,BYTE PTR BUFFER ;這個就是強制其為字節
? MOV AX, BUFFER

地址表達式

地址表達式——由“變量、標號、“+”、
“-” 數值表達式組成。
? 如:DATA+5;
? [注]含有變量的地址表達式其類型與該變
量一致,如VARY+4與VARY類型一樣
(VARY[BX]亦然);
? 地址表達式可以相減,不能相加(指針能夠相減但不能相加)

變量和標號屬性

變量的屬性:

? 段屬性——變量的段地址
? 偏移屬性——變量的偏移地址
? 類型屬性——變量所指單元的類型,字節變量、字變
量、雙字變量等

標號的屬性:

? 段屬性——是指定義標號所在段的段地址。
? 偏移屬性——是指定義標號處到段地址的距離。
? 類型屬性——NEAR型和FAR型。(不清楚是什么)

地址操作符

SEG 運算符

? 格式:SEG 變量或標號
? 功能:分離出其后變量或標號所在段的段首址。
? MOV AX,SEG ARR
? MOV DS,AX

OFFSET運算符

? 格式:OFFSET 變量或標號
? 功能:分離出其后變量或標號的偏移地址。
? MOV BX,OFFSET BUF

類型操作符

類型名 PTR
? 功能:指定類型 例: MOV WORD PTR [BX], 5

匯編程序編寫

源程序分別用兩種格式書寫
?第一種格式從MASM 5.0開始支持
? 簡化段定義格式
?第二種格式MASM 5.0以前就具有
? 完整段定義格式

stack segment stack dw 512 dup(?) stack ends data segment ... ;在數據段定義數據 data ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax ... ;在代碼段填入指令序列 mov ah,4ch int 21h ... ;子程序代碼 code ends end start

(1) 段類型說明偽操作

  • 在代碼段開始必須用ASSUME偽操作聲明段和
    寄存器之間的關系,格式為:
    ASSUME 段寄存器:段名 [,段寄存器名:段名, …]
  • 通知MASM,建立段寄存器與段的缺省關系;
    在需要時自動插入段超越前綴。這是ASSUME
    偽指令的主要功能。
  • 實際上,數據段之所以成為數據段,是由于DS
    指向它。由于程序運行時可以改變DS的值,使
    得任何段都可以成為數據段。
DATA1 SEGMENT X DB 1 DATA1 ENDS DATA2 SEGMENT Y DB 2 DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1 ,ES:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AL,X MOV AH,Y MOV AH,4CH INT 21H CODE ENDS END START

ASSUME語句位于在程序段開始位置

在ASSUME語句中并沒有給段寄存器
賦值。

DS、ES的初值必須在程序中設置:
? MOV AX,<段名>
? MOV DS/ES/SS,AX

CS與IP的初值不能在程序中顯式設置,由系統自動設置
為END后指定的起始地址

為SS與SP的初值
? 可在程序中顯式設置: SS同上,SP用 MOV SP,St_TOP
? 堆棧段定義時給出了屬性STACK,則由系統自動設置。
? 其他,則由系統指定堆棧,編譯時給出警告錯誤

(2)匯編結束偽指令

格式:
? END [標號]
功能:
? 指示源碼到此結束;
? 指示程序開始執行點(標號處)。

總結

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

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