C語言中處理結構體的原理

2021-07-23 23:18:03 字數 1538 閱讀 7701

彙編中有幾種定址方式,分別是直接定址:(ds:[idata])、暫存器間接定址(ds:[bx])、暫存器相對定址(ds:[bx + idata]、ds:[bx + si])基址變址定址(ds:[bx + si])、相對基址變址定址([bx + si + idata])。

結構體的儲存邏輯圖如下:(以下資料表示某公司的名稱、ceo、ceo的富比士排行、收入、代表產品)

現在假設公司的ceo在富豪榜上的排名為38,收入增加了70,代表產品變為vax,通過彙編程式設計修改上述資訊,以下是相應的彙編**:(假設資料段為seg)

mov ax,seg

mov ds,ax

mov bx,0

mov word ptr ds:[bx + 12],38

add [bx + 14],70

mov si,0

mov byte ptr [bx + 10 + si],'v'

inc si

mov byte ptr [bx + 10 + si],'a'

inc si

mov byte ptr [bx + 10 + si],'x'

對應的c語言**可以寫成:

struct company 

;company dec = ;

int main()

對比c語言**和彙編**,可以看出,對於結構體變數,系統會先根據定義分配相應大小的空間,並將各個變數名與記憶體關聯起來,結構體物件名與系統分配的空間的首位址相對應(定義的結構體物件的首位址在段中的相對位址儲存在bx中),即在使用dec名時實際與彙編**「mov ax,seg」 「mov ds,ax」

對應,將資料段段首位址存入ds暫存器中,系統根據物件中的變數名找到對應的偏移位址,偏移位址的大小由對應的資料型別決定,如cn陣列前沒有變數,cn的偏移位址為0,cn所在的位址為 ds:[bx],cn為長度為3的字元型陣列,在上乙個偏移位址的基礎上加上上乙個變數所佔空間的大小即為下乙個變數的偏移位址,所以name陣列的首位址為ds:[bx + 3],這樣給出了物件名就相當於給定了該物件在段中的相對位址(上述**中的bx),給定了物件中的成員變數名就相當於給定了某一內存在物件中的偏移位址(ds:[bx + idata])。根據陣列名可以找到陣列的首位址,但陣列中具體元素的訪問則需要給定元素個數,即si的值來定位陣列中的具體記憶體,c語言中的 ++i 相當於彙編中的 (add si ,陣列中元素的長度)。

根據以上的分析可以看出,構建乙個結構體物件時,系統會在**段中根據結構體的定義開闢相應大小的記憶體空間,並將該空間在段中的偏移位址與物件名繫結。物件中的變數名與該變數在物件所在記憶體中的偏移位址相關聯,陣列中的標號用於定位陣列中的元素在陣列中的相對位置。(物件名決定bx,變數名決定bx + idata,陣列中的元素標號決定bx + idata + si)。

C語言中結構體

struct oursvoid main struct ours o2 01 結構體整體直接賦值的時候,即使字串也可以直接賦值 o1.str o2.str 錯誤,字串不能直接賦值 字串拷貝的方式 sprintf o1.str,02.str strcpy o1.str,o2.str 3.1 第一種情況...

struct來處理C語言中的結構體

有的時候需要用python處理二進位制資料,比如,訪問檔案,socket操作時.這時候,可以使用python的struct模組來完成.可以用 struct來處理c語言中的結構體.struct模組中最重要的三個函式是pack unpack calcsize pack fmt,v1,v2,按照給定的格式...

C語言中的結構體

在 c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。結構體可以被宣告為 變數 指標或 陣列等,用以實現較複雜的 資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員 member 且這些成員可以為不同的型別,成員...