打印

汇编改成C

[复制链接]
1561|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
run_mo|  楼主 | 2009-1-11 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hotpower| | 2009-1-11 09:52 | 只看该作者

XBYTE[x]/xdata

sfr16 DPTR     = 0x82;
XBYTE[0x0000] = 0x43;
DPTR ++;

反汇编:
C:0x0275    900000   MOV      DPTR,#C_STARTUP(0x0000)
C:0x0278    7443     MOV      A,#0x43
C:0x027A    F0       MOVX     @DPTR,A
   450:         DPTR ++; 
   451:  
C:0x027B    0582     INC      DPTR(0x82);//inc dpl
C:0x027D    E582     MOV      A,DPTR(0x82)
C:0x027F    7002     JNZ      C:0283
C:0x0281    0583     INC      DPH(0x83)

一般为:
unsigned char i;
xdata unsigned char buff[200];
    for (i = 0;i < sizeof(buff); i ++)
    {
        buff = 0x43;
    }
反汇编:
   439: unsigned char i; 
   440: xdata unsigned char buff[200]; 
   441:         for (i = 0;i < sizeof(buff); i ++) 
   442:         { 
   443:                 buff = 0x43; 
C:0x0259    7FC8     MOV      R7,#T2CON(0xC8);//200
C:0x025B    900000   MOV      DPTR,#C_STARTUP(0x0000)
C:0x025E    7443     MOV      A,#0x43
C:0x0260    F0       MOVX     @DPTR,A
C:0x0261    A3       INC      DPTR
C:0x0262    DFFC     DJNZ     R7,C:0260
   444:         } 

使用特权

评论回复
板凳
hotpower| | 2009-1-11 10:10 | 只看该作者

Keil C51在xdata区用_at_无意思

unsigned char i;
extern unsigned char xdata buff[200] _at_ 0x8000;
    for (i = 0;i < sizeof(buff); i ++)
    {
        buff[0x2000 + i] = 0x43;
    }
实际还是:
unsigned char i;
extern unsigned char xdata buff[200] _at_ 0x0000;
    for (i = 0;i < sizeof(buff); i ++)
    {
        buff[0x2000 + i] = 0x43;
    }

反汇编:
   439: unsigned char i; 
   440: extern unsigned char xdata buff[200] _at_ 0x8000; 
   441:         for (i = 0;i < sizeof(buff); i ++) 
   442:         { 
   443:                 buff[0x2000 + i] = 0x43; 
C:0x0259    7FC8     MOV      R7,#T2CON(0xC8)
C:0x025B    902000   MOV      DPTR,#0x2000
C:0x025E    7443     MOV      A,#0x43
C:0x0260    F0       MOVX     @DPTR,A
C:0x0261    A3       INC      DPTR
C:0x0262    DFFC     DJNZ     R7,C:0260
   444:         } 

所以xdata不需绝对定位,只需:
unsigned char xdata buff[200];即可

buff[0x2000 + i] = 0x43;

它指出了开始地址0x2000

使用特权

评论回复
地板
run_mo|  楼主 | 2009-1-11 10:18 | 只看该作者

for (i = 0;i < sizeof(buff); i ++)

   为什么要for (i = 0;i < sizeof(buff); i ++)
这个呢?

使用特权

评论回复
5
hotpower| | 2009-1-11 10:24 | 只看该作者

晕~~~不for就不会编译为inc dptr,独立访问XBYTE最省心

使用特权

评论回复
6
run_mo|  楼主 | 2009-1-11 10:26 | 只看该作者

晕~~~不for就不会编译为inc dptr,独立访问XBYTE最省心

hotpower不要晕,俺刚刚学,不好意思!

使用特权

评论回复
7
hotpower| | 2009-1-11 10:31 | 只看该作者

sfr16 DPTR=0x82;DPTR ++;也达不到inc dptr的效果

使用特权

评论回复
8
ljm810010| | 2009-1-11 10:40 | 只看该作者

顺便问问hotpower,如何同时得到商和余数?

 A = M/N;
 B = M%N;
不想做两次除法

使用特权

评论回复
9
hotpower| | 2009-1-11 10:55 | 只看该作者

估计用A=M/N;B=M-A*N;

使用特权

评论回复
10
ljm810010| | 2009-1-11 11:17 | 只看该作者

晕,再做一次乘法和减法,效率差不多

使用特权

评论回复
11
hotpower| | 2009-1-11 11:21 | 只看该作者

不晕~~~你的命题“不想做两次除法”

哈哈~~~用C就不要想A的效率~~~

使用特权

评论回复
12
ljm810010| | 2009-1-11 11:27 | 只看该作者

那只得老老实实地C下去~~~

使用特权

评论回复
13
hnrain| | 2009-1-11 22:31 | 只看该作者

是啊。。用汇编乘除很不爽的。

使用特权

评论回复
14
icecut| | 2009-1-11 23:06 | 只看该作者

hotpower

这个估计不是马甲.

功力很深

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

44

帖子

0

粉丝