程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 計算機系統原理(十四) 數據格式、訪問信息及操作數指示符

計算機系統原理(十四) 數據格式、訪問信息及操作數指示符

編輯:匯編語言

引言

本文的內容其實可以成為匯編語言的基礎,因為匯編語言大部分時候是在操作一些我們平時開發看不到的東西,因此本文的目的就是搞清楚,匯編語言都是在操作些什麼東西。或者更准確的說,各種匯編指令都是在操作什麼樣的對象。

匯編層次的對象

在平時的開發過程中,CPU處理器的狀態對開發者是隱藏的,我們看不到CPU當中各個對象的狀態。但是在匯編語言中,我們可以清楚的看到這些對象的狀態,其中CPU主要包含以下幾個對象。

程序計數器(PC):記錄下一條指令的地址。

整數寄存器文件:共8個,可以存儲一些地址或者整數的數據。

條件寄存器:保存算數或邏輯指令的狀態信息,可以實現程序的流程控制。

浮點寄存器:存儲浮點數。

可以看出,這些都是CPU處理器當中的對象,上一章我們寫過一個簡單的C程序,相信如果不是看了匯編代碼,各位也都看不出來在程序運行過程中,CPU當中這些對象都在做著一些什麼樣的操作,又在存儲著一些什麼樣的內容。

數據的格式

在上一章當中,幾乎所有的匯編指令後面都有一個字母l,比如movl、addl、subl、pushl等等,這個l的後綴其實就是表示的數據格式,表示我們操作的是32位的數值。

在計算機從16位擴展到32位,以至於當前的64位來講,數據格式就一直在變。但是歷史總會多少影響著未來的走向,因此我們習慣稱16位為“字”,而32位則為“雙字”,相應的,64位則為“四字”。

以下我們以IA32架構為例,來看一下各個數據格式對應的後綴是什麼。

查看本欄目

操作數指示符

操作數指示符這個稱謂是書上給的,但LZ覺得這個概念不太容易理解,操作數指示符其實指的就是一種取值的標識方式,用來獲取參與各種操作的操作數。

這些標識方式一共有三種,一種是$符號後跟一個標准C表示的整數,比如$100,$0x11等等。第二種則是寄存器,當它作為一個操作數的時候,則是取的寄存器當中的數值。另外,對於寄存器來說,也可以選擇性的操作4個、2個、1個字節,而並不一定非要操作4個字節。最後一種,則是我們相對來說最熟悉的,就是存儲器或者說內存。當它作為一個操作數的時候,會去計算存儲器地址的數值,然後去這個地址取相應的數值。

對於這三種操作數的標識方式,在書中給出了一個表格,這裡LZ貼一下。

第一列是代表的類型,而第一行則是指的立即數,第二行則是指的寄存器,而剩下的都是存儲器了。對於立即數和寄存器來講,比較好理解,就是直接取值或者取寄存器的值。而對於存儲器來講,則有很多種情況,不過我們也可以看出,上面所有的情況,其實都是最後一種的特殊情況。Imm(Eb,Ei,s)是存儲器取值的一般形式,比如當Imm為0時,則是倒數第二種取值方式。對於其它的形式,也可以使用同樣的方式推算出來。

由於存儲器相對來說,理解起來比較困難一點。因此這裡LZ舉個簡單的例子,比如對於4(%esp,%eax,4)這個操作數來講,它代表的是內存地址為4+%esp+4*%eax的存儲器區域的值。

操作數是大部分指令都有的,因此上面的這些標識方式,在之後的文章中我們會經常看到,它們將會成為各位猿友很好的朋友。

文章小結

本章只介紹了一些匯編當中基礎的知識,這些內容相對來講不是特別困難,但卻是打開後面神秘大門的鑰匙。因此倘若有哪位猿友不是太理解本章的內容的話,LZ希望各位可以從實踐入手去理解一下本章的內容。這一點可以結合上一章來看,從上一章給出的匯編代碼中尋找數據格式、操作數以及寄存器的部分,這應該是十分輕松的,因為上一章的匯編代碼中充斥著這三個部分的內容。

作者:zuoxiaolong(左潇龍)

出處:博客園左潇龍的技術博客--http://www.cnblogs.com/zuoxiaolong

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved