|
发表于 2018-12-21 14:05:06
|
显示全部楼层
汇编和高级语言的实现逻辑不一样的。
给你看看高级语言转汇编和直接用汇编的差异
高级语言:
- $Device= m8 ' used device
- $Stack = 32 ' stack depth
- $Clock = 8 ' adjust for used crystal
- Declare Sub Delay(Delaytime As Integer)
- DDRC.0 = 1
- Do
- PORTC.0 = Not PORTC.0
- Delay(10000)
- Loop
- Sub Delay(Delaytime As Integer)
- Do
- Delaytime = Delaytime - 1
- Loop While Delaytime > 0
- End Sub
复制代码
转汇编,你会发现实现同样功能,高级语言写成的代码转汇编比直接用会编写的啰嗦很多
- .include "C:\FastAVR\inc\m8def.inc"
- ;
- .DSEG
-
- .CSEG
- .ORG 0x0000
- _Reset:
- ldi yl,byte1(RAMEND)
- out SPL,yl
- ldi yh,byte2(RAMEND)
- out SPL+1,yh
- sbiw yl,32
- ;****** USERS BASIC CODE **********************
- ;-Line--0011----DDRC.0 = 1--
- sbi DDRC,0
- ;-Line--0013----Do --
- L0000:
- ;-Line--0014----PORTC.0 = Not PORTC.0--
- in zl,PORTC
- bst zl,0 ;store zl,bit 0 to T flag
- bld zl,0x00
- ldi zh,0x01
- eor zl,zh
- bst zl,0x00
- brtc L0002
- sbi PORTC,0
- rjmp L0003
- L0002:
- cbi PORTC,0
- L0003:
- ;-Line--0015----Delay(10000)--
- ldi zl,byte1(10000)
- ldi zh,byte2(10000)
- st -Y,zh
- st -Y,zl
- call delay
- adiw yl,2
- ;-Line--0016----Loop--
- rjmp L0000
- L0001:
- ;-Line--0019----Sub Delay(Delaytime As Integer)--
- delay:
- ;-Line--0020----Do--
- L0005:
- ;-Line--0021----Delaytime = Delaytime - 1--
- ldd r24,y+0
- ldd r25,y+1
- ldi zl,byte1(1)
- ldi zh,byte2(1)
- sub r24,zl
- sbc r25,zh
- mov zl,r24
- mov zh,r25
- std y+0,zl
- std y+1,zh
- ;-Line--0022----Loop While Delaytime > 0--
- ldd r24,y+0
- ldd r25,y+1
- ldi zl,byte1(0)
- ldi zh,byte2(0)
- adiw zl,1
- cp r24,zl
- cpc r25,zh
- brge PC+0x02
- rjmp L0006
- rjmp L0005
- L0006:
- ;-Line--0023----End Sub--
- L0004:
- ret
复制代码 |
|