|
hex 到 asm 都不太容易做的。
目前只做51的反汇编和avr的汇编。
一般来说,如果在编译器上边不做手脚的话,hex是较容易攻破的。
全局变量泄漏的可能性要高于局部变量的。
尽管多数时候gcc-avr 都能很好的工作并且效率也不差,但是在某些情况下面临更换CPU系列的窘境。这个时候如果用汇编做一些模块可能更能够节省时间。不过这样做显然是以后续的可升级性做代价的。
下面代码是在mega8515,16m时钟上实现将 8位1M sps的数据写入16个连续的32Kbytes 空间,要求没有相位噪声。这用C是无法实现的。
#include <avr/io.h>
.section .text
.global vHighSpeedADC
.global vMidSpeedADC
.global cLowSpeedADC
.global cMemoryTest
vHighSpeedADC:
cli
push r0
push r1
push r2
push r3
push r16
push r30
push r31
clr r0
clr r1
clr r2
clr r3
ldi r30,0x00 ;Z low
ldi r31,0x80 ;Z Hi
mov r3,r31 ;Ram Address Hi
clr r0
ldi r16,0x0f
out 0x18,r0 ;PORTB
out 0x17,r16 ;DDRB
clr r0
ldi r16,0x07
; ldi r16,0x09
out 0x25,r0 ;ICR1H
out 0x24,r16 ;ICR1L
clr r0
ldi r16,0x02
out 0x2b,r0 ;OCR1AH
out 0x2a,r16 ;OCR1AL
clr r0
out 0x29,r0 ;OCR1BH
out 0x28,r16 ;OCR1BL
clr r0
out 0x2d,r0 ;TCNT1H
out 0x2c,r0 ;TCNT1L
ldi r16,0x50 ;
out 0x2f,r16 ;TCCR1A
ldi r16,0x19 ;
out 0x2e,r16 ;TCCR1B
ldi r16,0x06
out 0x06,r16 ;DDRE
ldi r16,0xe0
out 0x11,r16 ;DDRD
clr r30
ldi r31,0x80
mov r3,r31
clr r16
delay:
inc r16
cpi r16,20
brne delay ;2
clr r2
out 0x18,r2 ;PORTB
; wdr
; wdr
; wdr
; wdr
rjmp la0
la7:
ldi r16,0x80
mov r3,r16
la9:
clr r0
wdr
ori r31,0x80
la12:
out 0x18,r2
la0:
lds r1,0x4000 ;2 ;2
st z+,r1 ;2 ;2
ori r31,0x80
cpse r30,r0 ;1 ;2
rjmp la7 ;2 ;
cpse r31,r3 ;1 ;2
rjmp la9 ;2 ;
inc r2 ;1 ;1
sbrs r2,0x04 ;1
rjmp la12 ;2 ;
clr r16
out 0x2e,r16 ;TCCR1B
out 0x2f,r16 ;TCCR1A
pop r31
pop r30
pop r16
pop r3
pop r2
pop r1
pop r0
sei
ret |
|