彙編語言的基本知識

2021-02-13 電子工程師筆記

一、彙編語言的語句格式

    由彙編語言編寫的源程序是由許多語句(也可稱為彙編指令)組成的。每個語句由1~4個部分組成,其格式是:

    [標號]  指令助記符  [操作數]  [;註解]

    其中用方括號括起來的部分,可以有也可以沒有。每部分之間用空格(至少一個)分開,一行最多可有132個字符。

    1.標識符

    給指令或某一存儲單元地址所起的名字。可由下列字符組成:

    字母:A ~ z ; 數字:0 ~ 9 ; 特殊字符:?、· 、@、一、$ 。

    數字不能作標識符的第一個字符,而圓點僅能用作第一個字符。標識符最長為31個字符。當標識符後跟冒號時,表示是標號。它代表該行指令的起始地址;當標識符後不帶冒號時,表示變量;偽指令前的標識符不加冒號。

    2.指令助記符    

    表示不同操作的指令,可以是8086的指令助記符,也可以是偽指令。

    3.操作數

    指令執行的對象。依指令的要求,可能有一個、兩個或者沒有,

    例如: RET    ;無操作數

    COUNT: INC  CX    ;一個操作數

    如果是偽指令,則可能有多個操作數,例如:

    COST    DB    3,4,5,6,7  ;5個操作數

    MOV    AX,[BP+4]    ;第二個操作數為表達式

    4.註解

    該項可有可無,是為源程序所加的註解,用於提高程序的可讀性。


二、彙編語言的運算符

1.算術運算符、邏輯運算符和關係運算符

    算術運算符可以應用於數字操作數,結果也是數字。而應用於存儲器操作數時,只有+、-運算符有意義。

2.取值運算符SEG、OFFSET、TYPE、SIZE和LENGTH

    · SEG和OFFSET分別給出一個變量或標號的段地址和偏移量。

    例如,定義:    SLOT  DW  25

    則: MOV  AX,SLOT;從SLOT地址中取一個字送入AX

    MOV  AX,SEG  SLOT;將SLOT所在段的段地址送入AX

    MOV  AX,OFFSET  SLOT;將SLOT所在段的段內偏移地址送AX

    · TYPE操作符返回一個表示存儲器操作數類型的數值。各種存儲器地址操作數類型部分的值如表4-1所示。

    

    ·LENGTH和SIZE操作符只應用於數據存儲器操作數。(用DB/DW/DD等定義的操作數)

    LENGTH返回一個與存儲器地址操作數相聯繫的單元數,

    SIZE操作數返回一個為存儲器操作數分配的字節數。

    例如:若  MULT-WORD DW 50DUP(0)

    則  LENGTH(MULT-WORD)=50

    SIZE(MULT-WORD)=100

    注意:SIZE(X)=(LENGTH X)*(TYPE X)

3.屬性運算符

    屬性運算符用來給指令中的操作數指定一個臨時屬性,而暫時忽略當前的屬性。常用的有:

    (1) 合成運算符PTR

    它作用於操作數時,則忽略了操作數當前的類型(字節或字)及屬性(NEAR或FAR),而給出一個臨時的類型或屬性,

    一般格式:類型    PTR   表達式

    功能:建立一個存儲器地址操作數,它與其後的存儲器地址操作數有相同的段地址偏移量,但有不同的類型。

    例如:SLOT  DW  25

    此時SLOT已定義成字單元。若我們想取出它的第一個字節內容,則可用PTR對其作用,使它暫時改變為字節單元,

即 MOV  AL,BYTE  PTR  SLOT

三、表達式

由運算符和操作數組成的序列,在彙編時產生一個確定的值。這個值可以僅表示一個常量,也可以表示一個存儲單元的偏移地址,相應的表達式稱為常量表達式和地址表達式。

1. 常數

彙編語言語句中出現的常數可以有7種:

    ① 二進位數  後跟字母B,如01000001B。

    ② 八進位數  後跟字母Q或O,如202Q或202O。

    ③ 十進位數  後跟D或不跟字母,如85D或85。

    ④ 十六進位數  後跟H,如56H,0FFH。注意,當數字的第一個字符是A~F時,在字符前應添加一個數字0,以示和變量的區別。

另有,十進位浮點數、十六進位實數、字符和字符串

2.常量操作數

常量操作數是一個數值操作數,一般是常量或者是表示常量的標識符。可以為數字常量操作數或字符串常量操作數。前者可採用二進位、八進位、十進位或十六進位等計數形式;而後者則為相應字符的ASCII碼。

3.存儲器操作數

存儲器操作數是一個地址操作數,代表一個存儲單元的地址,通常以標識符的形式出現。

    存儲器操作數可以分為變量及標號兩種類型,如果存儲器操作數所代表的是某個數據在數據段、附加段或堆棧段中的地址,那麼這個存儲器操作數就稱為變量;如果存儲器操作數所代表的是某條指令代碼在代碼段中的地址,那麼這個存儲器操作數稱為標號。(http://www.diangon.com/版權所有)變量所對應的存儲單元內容在程序的運行過程中是可以改變的,標號通常作為轉移指令或調用指令的目標操作數,在程序運行過程中不能改變。

存儲器操作數有三個方面的屬性。

    (1)、段地址:即存儲器操作數所對應的存儲單元所在段的段地址;

    (2)、偏移地址:即存儲器操作數所對應的存儲單元在所在段內的偏移地址;

    (3)、類型:變量的類型是相應存儲單元所存放的數據項的字節數;而標號的類型則反映了相應存儲單元地址在作為轉移或調用指令的目標操作數時的尋址方式,可有兩種情況,即  NEAR和FAR。具體值可見表4-1

4.常量表達式

    由常量操作數及運算符構成,在彙編時產生一個常量。

    如PORT、VAL+1、 OFFSET SUM、SEG SUM、TYPE CYCLE等。

5.地址表達式

    由存儲器操作數與運算符構成,必須有明確的物理意義。

    例如  SUM+2、CYCLE-5

表達式SUM+2、CYCLE-5的值仍然是一個存儲器操作數,該存儲器操作數的段地址與類型屬性分別與存儲器操作數SUM及CYCLE相同,但偏移地址分別比SUM及CYCLE大2或小5。表達式是在彙編時計算的,而變量單元的內容在程序的運行過程中可以改變。


四、彙編語言程序彙編步驟

彙編語言程序要能在機器上運行,還必需將彙編源程序彙編成可執行程序。為此必須完成以下幾個步驟。

1.編輯源程序

2.調用宏彙編對源程序進行彙編

3.對目標程序進行連接

4.運行可執行程序並調試

電子愛動手,關注電子DIY

相關焦點

  • 彙編程序基本原理知識筆記
    1、彙編語言的概念
  • 彙編語言知識總結
    彙編語言是門很底層的語言(真的不能再底層了,不然只能用0101的機器語言編碼了╮(╯▽╰)╭),現在很少有人會用彙編語言編程的了(彙編中提供可直接調用的東西太少了,只有一些需要查表的int中斷或者win32彙編的API函數,用彙編寫代碼會很麻煩),那麼是否還有必要學習它呢?答案當然是肯定的。
  • 彙編語言入門
    雖然現在市面上關於彙編語言的書籍資料無窮多,卻無從下手?
  • 彙編語言的指令格式和基本語法講解
    單片機彙編語言彙編錯誤原因分析彙編語言的指令格式,目前有兩種不同的標準:Windows下的彙編語言基本上都遵循Intel
  • C語言與彙編語言的區別
    如果你問一個程式設計師這樣的問題,他也許會這麼回答你:「C語言可讀性好,代碼便於維護,便於開發;彙編語言編寫的程序不容易看懂,可維護性不好,但是執行效率高。」這樣回答是沒有錯的,但只是一個概括,不夠深入。比方說,彙編語言為什麼執行效率比C語言高呢?C語言的可讀性又好在哪裡呢?彙編語言不同樣可以用註解來提高可讀性嗎?等等這些的問題。
  • 彙編語言入門教程
    彙編語言就是低級語言,直接描述/控制 CPU 的運行。如果你想了解 CPU 到底幹了些什麼,以及代碼的運行步驟,就一定要學習彙編語言。彙編語言不容易學習,就連簡明扼要的介紹都很難找到。下面我嘗試寫一篇最好懂的彙編語言教程,解釋 CPU 如何執行代碼。
  • @程式設計師,快來速取硬核的彙編語言知識大全!
    作者 | cxuan 責編 | maozz彙編語言作為第二代計算機語言,會用一些容易理解和記憶的字母,單詞來代替一個特定的指令,作為高級程式語言的基礎,有必要系統的了解一下彙編語言,那麼本篇文章希望大家跟我一起來了解一下彙編語言。
  • 【彙編語言】入門教程
    彙編語言就是低級語言,直接描述/控制 CPU 的運行。如果你想了解 CPU 到底幹了些什麼,以及代碼的運行步驟,就一定要學習彙編語言。彙編語言不容易學習,就連簡明扼要的介紹都很難找到。下面我嘗試寫一篇最好懂的彙編語言教程,解釋 CPU 如何執行代碼。
  • 《彙編語言》——筆記(一)
    基礎知識在講彙編語言之前,先介紹下機器語言。機器語言是機器指令的集合。電子計算機的機器指令是一列二進位數字,計算機將轉變高低電平,來驅動電子器件。計算機是可以執行機器指令,進行運算的機器。這是早期的概念。現在,有一個晶片來完成上面所說的計算機的功能。這個晶片便是CPU(Central Processing Unit,中央處理單元),CPU是一種微處理器。
  • Keil中C語言與彙編語言混合編程需要注意的幾個地方
    在keil C語言與彙編語言的混合編程中曾經遇到過的一些問題,寫下來留作以後參考。1、C語言中加入彙編語言模塊的方法:例子:void func(){C語言代碼……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET
  • 解密入門教學(二)--彙編語言
    稍微有點兒計算機知識的朋友一定知道,計算機是只識別 0 和 1 的,最初那會兒,要寫程序,就要用 0 和 1 來寫,呵呵,Cool吧!所以曾經有過的對程式設計師的崇拜,可能就源自那個時候吧  後來,人們發現用0和1來寫程序,太不爽了,不但寫起來不上手,而且回過頭來看的話,應該很難再看明白了,總之出於這些原因,就有了彙編語言。
  • C語言程序執行從彙編角度詳解
    tid=2403023011&_trace_c_p_k2_=b007fad39e354f55af484d41391c5783#/learn/announce關鍵字:棧,函數,調用,彙編,寄存器 概述:C語言程序介於彙編語言和高級語言中間面,擁有直接操縱內存入口,同時擁有高級語言易讀性
  • 內功修煉,彙編語言入門教程
    彙編語言就是低級語言,直接描述/控制 CPU 的運行。如果你想了解 CPU 到底幹了些什麼,以及代碼的運行步驟,就一定要學習彙編語言。彙編語言不容易學習,就連簡明扼要的介紹都很難找到。下面我嘗試寫一篇最好懂的彙編語言教程,解釋 CPU 如何執行代碼。
  • 0基礎手把手入坑CTF逆向(1)——彙編語言學習
    年前曾寫過一篇文章 《CTF逆向選手入坑指南》https://www.freebuf.com/articles/web/225999.html  當時只是大概的介紹了一下入坑CTF逆向所需要知道的一些基本概念、術語、還有需要學習的知識等,並沒有對提到的知識點進行詳細的講解和案例講解。
  • 《彙編語言》
    兩個月前看完王爽著的《彙編語言》經過一段時間的休整,今天再次翻開來又有另一番滋味,趁著最近對底層原理這股熱情,對書本的內容進行一些整理。我的初衷是希望更多的理解程序集在計算機中執行的原理,我中意《深度探索C++對象模型》裡作者說的一句話,他說「我的經驗告訴我,如果一個程式設計師了解底層實現模型,他就能夠寫出效率較高的代碼,自信心也比較高。
  • arm:c語言和彙編混合編程
    1.C和彙編可相互調用,彙編子函數格式參考彙編:普通的函數調用的彙編代碼解析http://www.cnblogs.com/mylinux/p/4139972.html本文引用地址:http://www.eepw.com.cn/article/201611/317685.htm  本文演示了 : 彙編嵌入到c語言;
  • 高級語言中的語句在彙編中是如何實現的
    我們都知道對於c語言來說,它是需要先轉換成彙編語言,然後再生成機器語言的。那麼在c語言中,各種條件語句,各種表達式的計算,在彙編中是何如實現的呢?今天我們就來講解一下。彙編語言彙編語言是由包含用助記符如 ADD、MOV、SUB 和 CALL 書寫的語句。彙編語言與機器語言是一對一(one-to-one)的關係:每一條彙編語言指令對應一條機器語言指令。
  • 從AT&T彙編語言的HelloWorld說起
    AT&T彙編語言的HelloWorld代碼
  • 編寫彙編語言常見錯誤分析
    一、彙編軟體彙編失敗原因分析:本文引用地址:http://www.eepw.com.cn/article/201602/287210.htm  這裡採用Keil C51軟體包中的宏彙編器A51
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    另外在一些對性能非常敏感的代碼塊,基於彙編與機器碼一一對應的關係,這時不能依靠C編譯器的生成代碼,而要手工編寫彙編,從而達到優化的目的。彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,不涉及C++語言。