原文:https://www.pediy.com/kssd/pediy10/98815.html
Asm中的数组研究
前言:
这个不算是asm魅力系列的文章,只是回答一个朋友的问题!因为写的长了就发出来,希望对大家有帮助!
问题:
http://bbs.pediy.com/showthread.php?p=694325#poststop
任何语言中的数组实际上都是指针的概念,你这样想,一些数据放在内存的一个区域里面,我们要怎么访问他们呢?
步骤:
首先我们得知道这些数据在哪个内存块。其次要知道怎么在这个内存块里面找到我们要的那个指定的数据!
C或者是其他的高级语言把这些东西格式化了,比如char a[]={1,2,3,4};然后访问的时候 a[0] a[1] a[2] a[3] 实际上还是以前的老话,你要是理解了这种抽象过的符号表示的话,其实是很好理解的。但是asm比较接近人的思维,什么思维呢?就是我在步骤里提到的这种人人都能立刻想到的思路!
(一)
我先就用masm来说把!那么masm也做了一些格式化,所以我们操作数组也可以比较方便!
来看一小段:
.data Array BYTE 1,2,3 .code Mov esi,OFFSET Array
arrayA BYTE 1h,2h,3h,4h arrayB WORD 1000h,2000h,3000h,4000h
.data arrayB WORD 1000h,2000h,3000h,4000h .code Mov esi,offset arrayB Mov eax,[esi] Add esi,4
.data arrayB WORD 1000h,2000h,3000h,4000h .code Mov esi,offset arrayB Mov eax,[esi] Mov ebx,[esi+2] Mov ecx,[esi+4]
.data arrayB WORD 1000h,2000h,3000h,4000h .code Mov esi,0h Mov eax,[arrayB+esi] Mov ebx,[arrayB+esi+2] Mov ecx,[arrayB+esi+4]
#include "stdio.h" #include "stdlib.h" int main() { char a[2]={1,2}; for(int i=0;i<sizeof(a);i++) { printf("%d\n",a[i]); } return 0; }
#include "stdio.h" #include "stdlib.h" int main() { char a[2]={1,2}; for(int i=0;i<sizeof(a);i++) { printf("%d\n",*a+i); } return 0; }
.data Array db 1h,2h,3h,4h .code Point PTR BYTE Array Mov esi,point Mov eax,[esi]
9: printf("%d\n",a[i]); 0040D738 mov ecx,dword ptr [ebp-8] 0040D73B movsx edx,byte ptr [ebp+ecx-4]