TA的每日心情 | 开心 2018-3-29 07:24 |
---|
签到天数: 4 天 [LV.2]偶尔看看I
|
发表于 2009-5-11 00:20:34
|
显示全部楼层
第1个代码的理解:
- seg000:0201 mov si, 194h ; char *a="ChinaPYG!"
- seg000:0204 mov [bp+var_2], 0 ;对应int *b=0,b为指针变量,指向[bp+var_2]地址,注意是int型,两字节
- seg000:0209 jmp short loc_10221
- seg000:020B ;--------------------------------------------------------------
- seg000:020B
- seg000:020B loc_1020B:
- seg000:020B mov al, byte ptr [bp+var_2+1] ;(char *)&b+1,前面的(char *)相当于byte ptr
- seg000:020E cbw
- seg000:020F mov bx, ax
- seg000:0211 mov al, [bx+si] ;*(a + *((char *)&b+2)),a对应si,bx对应*((char *)&b+1,按位取字符
- seg000:0213 cbw
- seg000:0214 push ax
- seg000:0215 mov ax, 19Eh
- seg000:0218 push ax ; format ;格式化
- seg000:0219 call _printf ;输出字符
- seg000:021C pop cx
- seg000:021D pop cx
- seg000:021E inc byte ptr [bp+var_2+1] ;(*((char *)&b+1))++,*((char *)&b+1),指向地址中的内容,增1
- seg000:0221
- seg000:0221 loc_10221:
- seg000:0221 push si
- seg000:0222 call _strlen ; strlen(a)
- seg000:0225 pop cx
- seg000:0226 push ax ; ax中为strlen(a)的结果
- seg000:0227 mov al, byte ptr [bp+var_2+1] ;[bp+var_2+1]也为0,看清楚了前面定义的是int型,这是第2字节
- seg000:022A cbw
- seg000:022B pop dx ; dx=ax,为strlen(a)的结果
- seg000:022C cmp dx, ax ; 比较是否大于字符串长度,即是否取完字符串
- seg000:022E ja short loc_1020B ; 没取完接着跳到前面按位输出字符
- seg000:0230 mov ax, 1A1h
- seg000:0233 push ax ; format
复制代码 用ida看确实比较清楚,int *b=0这句是定义了一个指向整型的指针变量并赋初值,而这里的(char *)&b+1是int型
第二字节的地址,*((char *)&b+1)就是取第二字节的内容了,所以这里的(char *)很关键
如果我们这样改一下,就会更好理解了
- #define H strlen(a)
- #include <stdio.h>
- #include <string.h>
- main()
- {
- char *a="ChinaPYG!";
- int *b=0;
- *((char *)&b+1)=3; 注意这句,这样将会从数组的第4个元素开始取,结果为"naPYG!"
- for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
- printf("%c",*(a + *((char *)&b+1)));
- }
复制代码 练习题:
[ 本帖最后由 x80x88 于 2009-5-11 10:24 编辑 ] |
|