请教一个关于从奇数地址取值出现的问题
本帖最后由 justdomyself 于 2014-5-26 19:52 编辑#define MEM_W(x) ((WORD) *((WORD*)(x)) )
typedef struct
{
WORD ID; // Message Identifier
BYTE LEN; // Data length (0-8)
BYTE RTR;
BYTE BUF; // Data buffer
} CAN_MSG;
CAN_MSG msg,*pmsg;
msg.BUF=0X20;
msg.BUF=0X05;
msg.BUF=0X60;
msg.BUF=0X00;
pmsg=&msg;
WORD tmp=MEM_W(&pmsg->BUF);
为何tmp的值是5 而不是0x6005
char buf[]={0x11,0x22,0x33,0x44};
test=MEM_B(buf);
test=MEM_W(buf);
test=MEM_DW(buf);
但是这样又能正确的取到值
tmp=MEM_W(&pmsg->BUF);
mov r0,#5
ldrh r5,
tmp=MEM_W(&msg.BUF);
mov r0,#5
ldrh r5,
为啥反汇编就成了ldrh半字读取 ,奇怪
送你一張圖。
qlb1234 发表于 2014-5-26 16:52
送你一張圖。
如果看出问题,请明言 WORD tmp=MEM_W(&pmsg->BUF); 这个是先取&pmsg了,呵呵,学习了。 WORD tmp=MEM_W(&(pmsg->BUF));效果也一样啊 laujc 发表于 2014-5-26 16:58
WORD tmp=MEM_W(&pmsg->BUF); 这个是先取&pmsg了,呵呵,学习了。
WORD tmp=MEM_W(&(pmsg->BUF));效果也一样啊 甚麼?tmp的值不是0x6005?你怎麼看的? qlb1234 发表于 2014-5-26 17:16
甚麼?tmp的值不是0x6005?你怎麼看的?
设断点 观察变量的值 0x60被抹了??你读读Buf的值:WORD tmp2 = pmsg->BUF; xf331785508 发表于 2014-5-26 18:19
0x60被抹了??你读读Buf的值:WORD tmp2 = pmsg->BUF;
没有被抹掉,tmp2的值是有的
tmp=MEM_W(& (pmsg->BUF) );
mov r0,#5
ldrh r5,
tmp=MEM_W(&msg.BUF);
mov r0,#9
ldrh r5,
tmp2=pmsg->BUF;
ldrb r6,
细看可以发现反汇编是 ldrh 半字加载指令 就不知道怎么编译器就编译成ldrh了 如果是LDR就是正常的值 貌似找到原因了:
tmp=MEM_W(& (pmsg->BUF) );
tmp=MEM_W(& (pmsg->BUF) );
这两个可以正常取值,也就是说不能从奇地址进行双字节或者四字节的数据读取 tmp=MEM_W(& (pmsg->BUF) );
mov r0,#5
ldrh r5,
上代码中r4是一个偶地址,r4+r0就变成了奇地址
ldrh r5,就出现了问题
页:
[1]