[利用asm代码学习c++语法]--两种字符数组、指针、指针转换

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:

#include <stdio.h>
int main(int argc, char* argv[])
{
 char c[] = "ABC";
 char *p = c;
 long *i = (long*)p;
 *i += 0x202020;
 printf("%s/n", p);
 char c1[5] = {'A',0};
 return 0;
}

; 4    :  char c[] = "ABC";

 mov eax, DWORD PTR ??_C@_03FFFJFKND@ABC?$AA@;取字符串地址
 mov DWORD PTR _c$[ebp], eax;c变量只是栈上一个4byte的空间,存的是字符串的地址

; 5    :  char *p = c;

 lea eax, DWORD PTR _c$[ebp];Load Effective Address
 mov DWORD PTR _p$[ebp], eax;p变量只是栈上一个4byte的空间,字符串指针对象

; 6    :  long *i = (long*)p;

 mov eax, DWORD PTR _p$[ebp];强制指针转换在编译器做完,编译结果没有痕迹
 mov DWORD PTR _i$[ebp], eax

; 7    :  *i += 0x202020;;考虑intel是little endian。此处加0x202020后就变为小写字符串

 mov eax, DWORD PTR _i$[ebp]
 mov ecx, DWORD PTR [eax]
 add ecx, 2105376    ; 00202020H
 mov edx, DWORD PTR _i$[ebp]
 mov DWORD PTR [edx], ecx

 
; 9    :  char c1[5] = {'A',0};

 mov BYTE PTR _c1$[ebp], 65   ; 00000041H;c1变量仅在开发环境中是个对象,编译后只是一个有地址的内存空间
 mov BYTE PTR _c1$[ebp+1], 0
 xor eax, eax
 mov WORD PTR _c1$[ebp+2], ax;接着自动初始化字符串
 mov BYTE PTR _c1$[ebp+4], al

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值