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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言学习笔记(五)

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

十六、數組

數組的基本表示方法

numary sdword 2,5,7

numary數組中有三個元素,為sdword類型,分別為2,5,7

empary sdword ?, ?,?

empary數組為sdword類型元素,未初始化。

如果數組元素很多可通過

zeroary sdword 100 dup(0)

zeroary數組中有100個0

empary sdword 3 dup(?)

empary 數組中有3個未初始化的sdword類型數據

mov eax, numary+8; 表示把數組numary第3個元素放入eax中

sdword為四字節,numary+0表示numary首地址,也是第一個元素地址,以此類推,numary+8為第三個元素首地址。

mov numary+0, eax; 將eax內容放入數組第一個元素中。

出了采用數組首地址+偏移地址方式,可以采用ebx基址寄存器進行數組索引。

訪問numary第三個元素

mov ebx, 8;ebx存儲8

mov eax, numary[ebx];訪問numary偏移8字節的元素,也就是第三個元素,放入eax中。

舉個例子C語言:

sum = 0 for(i = 0; i < 3; i++) {sum +=numary[i]; }

匯編語言:

mov sum, 0 mov ecx ,3 mov ebx, 0 .repeat mov eax, numary[ebx] add sum, eax add ebx,4 .untilcxz

?

除了使用基址寄存器ebx,還可以使用寄存器esi和寄存器edi進行索引,

esi為源索引寄存器,edi為目的索引寄存器。

第一種方法

mov ebx,4

mov eax,numary[ebx]

第二種方法

mov esi, offset numary+4

mov eax,[esi]

第二種方法先將numary+4的地址放入esi中,

然后[esi]取出esi指向的地址空間的數據,也就是numary+4地址空間里的數據

將數據放入eax中。

兩種方法的效果圖:

?

?

除了上述兩種方法,還有第三種方法

lea esi, memory+4

mov eax, [esi]

lea 和offset的區別:

offset 是在編譯時將地址寫入esi

lea是動態寫入,每次運行時將地址寫入esi中。

去實現如下代碼:

j=n-1; for(i=0; i < n/2; i++) {temp=numary[i];numary[i] = numary[j];numary[j] = temp;j--; }

通過匯編實現:

mov ecx,n sar ecx,1 lea esi,numary+0 mov edi, esi mov eax,n dec eax sal eax,2 add edi, eax .repeat mov eax, [esi] xchg eax, [edi] mov [esi], eax add esi,4 sub edi,4 .untilcxz

?

數組還有兩個指令,lengthof表示數組元素的個數

sizeof表示數組總共占用多少字節。

前面的代碼可以通過這兩個指令修改

mov ecx, lengthof numary sar ecx,1 lea esi, numary+0 mov edi, esi mov eax, sizeof numary sub eax,4 add edi, eax .repeat mov eax,[esi] xchg eax, [edi] mov [esi], eax add esi, 4 sub edi,4 .untilcxz

?

?

十七、數組總結

1 esi 為源索引寄存器,主要用于從esi指向地址空間取出數據

2 edi為目的索引寄存器,主要用于向edi指向地址空間寫入數據

3 esi和edi存儲的為地址,[esi]和[edi]為他們指向的地址空間存儲的數據

4 可以通過mov edi, esi將esi寄存器存儲的地址放入edi中,因為兩個操作數都是寄存器

5 不可以使用mov [edi],[esi];因為兩個操作數都為內存,這是匯編指令mov不允許的。

6 寄存器ebx為基址寄存器,可通過 ? 數組名[ebx]取出數組首地址偏移ebx存儲的字節數的元素。

7 offset操作符的mov指令,如mov eax, offset sumary+4 是將sumary首地址偏移4字節地址寫入eax,

? 此時eax存儲的是第二個元素首地址,他是靜態的獲取地址,而lea是動態的獲取地址

8 lengthof用于計算數組元素數量,sizeof用于計算數組總共占用多少字節。

?

數組的介紹到此為止,下一篇是字符串的介紹

我的公眾號:

?

轉載于:https://www.cnblogs.com/secondtonone1/p/6700449.html

總結

以上是生活随笔為你收集整理的汇编语言学习笔记(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

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