智能车制作
标题: 汇编问题,请教高手 [打印本页]
作者: CenaTP 时间: 2009-5-16 10:39
标题: 汇编问题,请教高手
C语言下定义一数组byte b_start[ROW];
一变量 byte i;
然后用汇编给每个单元赋值255 汇编程序如下
loop1: LDX b_start 或者是 LDX #b_start
LDAA #255
STAA i,X
INC i
LDAA i
CMPA #ROW
BLO loop1 //init over
上述程序达不到我要的效果,我又找不出有什么问题
有没有董汇编的高手指点一下
作者: azure 时间: 2009-5-16 23:27
LDAB ROW//加载数组长度
loop1: LDX b_start //加载数组基地址到索引寄存器X中
LDAA #255
STAA X//将累加器A中的值存到以X寄存器内容为地址的RAM中
INX //X中的值加1
DBNZ B,LOOP1//将累加器B的值减1,然后与零比较,如果不为零就跳到LOOP1处
作者: CenaTP 时间: 2009-5-16 23:53
2# azure
这个哥们先谢谢你
不过不行啊
STAA X 这句不行 要写成 STAA 0,X才不报错
DBNZ 这个命令也没有 DBEQ到有一个功能一样的
改了还是达不到效果
还有我们的ROW是这样定义的 #define ROW 25
LDAB ROW 这句是不是要改成LDAB #ROW
作者: CenaTP 时间: 2009-5-16 23:55
2# azure
错了 不是DBEQ 是DBNE
作者: ht59667038 时间: 2009-5-17 15:27
汇编指令运行时就会自动停止...这是什么问题呢?
作者: azure 时间: 2009-5-17 21:59
我不是在C代码中嵌入汇编代码,而是在新建工程选编程语言的时候C与汇编都打上勾,这样生成的工程里会有一个main.asm文件,我给的汇编代码是在main.asm里面写的,汇编里调用C中定义的变量只需在main.asm文件中加上一句XREF ROW就可以了;STAA X肯定没错,把最后一句改成DBNE B,LOOP1
当你在C化码中需要初始化数组时,调用asm_main()就可以了(好长时间没摸这个东西了,资料都删光了,不好意思哈)
作者: CenaTP 时间: 2009-5-18 08:13
5# ht59667038
大概是你人品不好吧
作者: CenaTP 时间: 2009-5-18 08:13
5# ht59667038
大概是你人品不好吧
作者: CenaTP 时间: 2009-5-18 08:17
6# azure
看来哥们你真的是高手啊
这只是我们图像处理程序的一部分
我们把汇编的图像处理嵌入到整个大程序的时候编译不会报错
但是执行的时候会自动停止
这是怎么回事
作者: azure 时间: 2009-5-18 12:43
自动停止的问题开始时我也遇到过,我也不知道为什么,最初我采集图像只用一个外部中断IRQ,配合其它的一些管脚来实现采集,这个方案浪费了我很多时间,我左看右看都没有问题(可能是我没查出来),最让人吐血的就是单片机采了一幅就停止运行了,而且采到的图像还是严重错位的(非一般人所能想像的那种错位),后来我知道图像错位的原因是IRQ中断ISR在无阻循环的执行,自动停止我猜想可能是IRQ ISR无限循环执行导致堆栈溢出,个人猜测,不必深究。后来改用timer的中断才实现正常采集。如果你用的是IRQ中断的话,建议你改用其它管脚的中断试试。(经验之谈,希望有用)
作者: CenaTP 时间: 2009-5-18 18:36
10# azure
我们先用C语言写的处理程序 在整个程序里没有问题可以运行
就是处理的部分换成汇编就不行了 这样看来不是中断口的问题
堆栈溢出倒是有可能
因为一直有SP 警报的
作者: etch 时间: 2009-5-27 14:18
#define tmp(i) (tmp##i)
#define ROW (0x1fff)
unsigned char*iterator=0,*current=0,*b_start[ROW];
void main(void){*iterator=0;*current=0;*b_start[0]=255;
//CLR [iterator,PCR]
//CLR [current,PCR]
//LDAB #255
//STAB [b_start,PCR]
for(;*iterator<(ROW);){*b_start[*current]=255;
//BRA *+31 ;abs = 002d
//LDAB [current,PCR]
//LSLD
//TFR D,X
//LDY b_start,X
//LDAB #255
//STAB 0,Y
*current++;*iterator++;
//LDX current
//INX
//STX current
//LDX iterator
//INX
//STX iterator
//LDAB [iterator,PCR]
//CLRA
//CPD #8191
//BLT *-37 ;abs = 0010
};
}
//RTS
作者: etch 时间: 2009-5-28 06:40
#define default (0xff)
#define ROW (0x1fff)
unsigned char iterator=0,current=0,b_start[ROW];
main(){iterator=0;current=0;b_start[0]=default;
//clr #iterator
//clr #current
//ldab #default
//stab #b_start
for(;iterator<(ROW);){b_start[current]=default;
//bra *+31 ;abs = 002d
//ldab #current;//lsld;//tfr d,x
//ldaa #default
//ldy #b_start,x
//ldab #default
//stab 0,y
current++;iterator++;
//ldx #current
//inx
//stx #current
//ldx #iterator
//inx
//stx #iterator
//ldab #iterator;//clra
//cpd #ROW
//blt *-37 ;abs = 0010
};
}
作者: etch 时间: 2009-5-28 06:52
本帖最后由 etch 于 2009-5-28 07:15 编辑
作者: etch 时间: 2009-5-28 07:00
ldd #65535
std b_start
std b_start:2
.
.
.
std b_start:8192
作者: CenaTP 时间: 2009-6-8 12:21
15# etch
啊 这么详细的
真是太感谢了
作者: gshking 时间: 2009-9-24 11:26
好东西
欢迎光临 智能车制作 (http://dns.znczz.com/) |
Powered by Discuz! X3.2 |