汇编语言学习笔记(五)
十六、數組
數組的基本表示方法
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
總結
以上是生活随笔為你收集整理的汇编语言学习笔记(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [译] MDC-103 Flutter:
- 下一篇: 复变函数在计算机科学中的应用,复变函数的