首页
社区
课程
招聘
[原创]asm操作数组[回答一个朋友的问题]
发表于: 2009-10-2 11:03 17988

[原创]asm操作数组[回答一个朋友的问题]

2009-10-2 11:03
17988

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]

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 8
支持
分享
最新回复 (21)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
翻了一下才你的精华才看到,顶一下(你已经是大牛了)
2009-11-30 21:16
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
路过 看过 标记
2010-10-24 11:45
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#include "stdio.h"
#include "stdlib.h"

int main()
{
  char a[2]={3,6};
  for(int i=0;i<sizeof(a);i++)
  {
  [COLOR="Red"]printf("%d\n",*(a+i));[/COLOR]  }// 改
  return 0;
}



这篇文章有错吧。

‘*’的优先级要高于‘+’
LZ的文章之所以结果正确是因为 取的值巧合如果不是 char [2] = {1,2} ;

结果想当然。
2011-1-24 23:49
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
ls正解, lz写错了
2011-4-20 18:01
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
确实,*号优先级要高
2011-4-26 14:01
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
来学习的.......
2011-7-26 19:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
指针是人的日常生活里广大人名群众喜闻乐见的一种思维方式!------倒

发现一个错别字“名”->“民”。楼主写的不错,嘎嘎!
2012-5-16 08:45
0
雪    币: 330
活跃值: (105)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
前排留名,小弟受教了。
2012-5-26 15:47
0
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
10
你那个类型哦。。。定义的BYTE型 却用 mov eax,[esi] 还是 mov al,byte ptr [esi]好一些
那个 WORD 型的有问题吧 怎么 add esi,4 呢? WORD型不是两字节?

.data

Array db 'Hello WOrld',0

.code

lea esi, Array
@@:
lodsb
; al == Array[i]
or al,al
jne @B
2012-5-26 15:53
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
总结的不错,很有意义
2013-3-8 16:36
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
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);  //这里是先取a的地址在加i,在变量前面的不在是一元操作符而是指针 先取到a的地址0加1后输出结果变为1和2,从而不是输出0和1
}
}
2020-2-1 00:31
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
说错了,应该是"*"在单个变量前不是一元操作符 而是指针引用
最后于 2020-2-1 00:33 被薛定谔消失的弦编辑 ,原因:
2020-2-1 00:32
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
把数组里的值换成1和3看看结果,难道*的优先级不是大于+?a[i]=*(a+i),这里的括号很有必要

最后于 2020-2-1 08:56 被htpidk编辑 ,原因:
2020-2-1 08:52
0
雪    币: 30
活跃值: (760)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
10年的老帖子复活了
2020-2-1 12:06
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
htpidk 把数组里的值换成1和3看看结果,难道*的优先级不是大于+?a[i]=*(a+i),这里的括号很有必要
你把数组里的1和3换成,2和6看看 看一下是不是在指针a(数值2)的基础上加i(数值1)覆盖到ds:[1]内存快上。
2020-2-1 22:04
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
没有细看你发的,指针优先级是要高于加号的 *(a+i)则是先取地址a的值后再加上for循环i的值 这时候就可以表述第一个是段地址[0],第二个i值则是段地址+偏移地址[1]
2020-2-1 22:18
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
应该是 *(a+i),指针优先级应高于+操作符。
2023-3-14 10:58
0
雪    币: 1545
活跃值: (4598)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
哥们你那个改成这样:*(char*)(&a)+i,数组直接用还是取地址符取地址都是一样的吗我看驱动里像大哥这么写必蓝
2023-3-25 23:58
0
雪    币: 890
活跃值: (2151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
逆向爱好者 哥们你那个改成这样:*(char*)(&a)+i,数组直接用还是取地址符取地址都是一样的吗我看驱动里像大哥这么写必蓝
卧槽越写越复杂,别酱
2023-3-26 11:38
0
雪    币: 1545
活跃值: (4598)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
mb_uulqeyon 卧槽越写越复杂,别酱
驱动直接用数组名会蓝屏的,驱动不会把数组名当指针
2023-3-26 12:36
0
雪    币: 1545
活跃值: (4598)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
mb_uulqeyon 卧槽越写越复杂,别酱

2023-3-26 12:46
0
游客
登录 | 注册 方可回帖
返回
//