有人知道如何在汇编代码中随机生成8位数字吗?
我正在使用ATmega8535和Atmel AVR汇编器,AVR模拟器进行调试。(AVR Studio 4)
抱歉,我对此还很陌生,任何帮助都将不胜感激。谢谢。
(编辑)看起来我在这里链接的所有 AVR Freaks 上的对话都已被删除。
AVR Freaks 上有一 讨论关于使用汇编语言生成 8 位随机数的对话,其中有一条评论 提供了一个内联汇编器的解决方案。
根据这个... 我想出了以下代码:
.device ATMega324P
.def _high = r16
.def _low = r17
.def _mask = r18
.def _step = r19
.def _delay1 = r20
.def _delay2 = r21
.cSeg
.org 0x0000
jmp resetHandler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.dSeg
lfsr16High:
.byte 1
lfsr16Low:
.byte 1
.cSeg
.equ lfsr16Seed = 0xACE1
.macro setup16BitLFSR
ldi _high, high(lfsr16Seed)
ldi _low, low(lfsr16Seed)
sts lfsr16High, _high
sts lfsr16Low, _low
.endMacro
.macro randomByteFrom16BitLFSR
lds _high, lfsr16High
lds _low, lfsr16Low
; Masks for 16-bit LFSR. Uncomment only one
ldi _mask, 0x9C
; ldi _mask, 0xB4
; ldi _mask, 0xBD
; ldi _mask, 0xCA
; ldi _mask, 0xEB
; ldi _mask, 0xFC
ldi _step, 8
step: ; run the LFSR 8 steps
lsr _high
ror _low
brcc noMask ; output bit set?
eor _high, _mask ; yes, apply mask
noMask:
dec _step ; done?
brne step ; no, loop
sts lfsr16High, _high
sts lfsr16Low, _low ; random byte is in _low register
.endMacro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.dSeg
lfsr8:
.byte 1
.cSeg
.macro setup8BitLFSR
ldi _low, 0x37 ; seed value
sts lfsr8, _low
.endMacro
.macro randomByteFrom8BitLFSR
lds _low, lfsr8
; Masks for 8-bit LFSR. Uncomment only one
ldi _mask, 0x8E
; ldi _mask, 0x95
; ldi _mask, 0x96
; ldi _mask, 0xA6
; ldi _mask, 0xAF
; ldi _mask, 0xB1
; ldi _mask, 0xB2
; ldi _mask, 0xB4
; ldi _mask, 0xB8
; ldi _mask, 0xC3
; ldi _mask, 0xC6
; ldi _mask, 0xD4
; ldi _mask, 0xE1
; ldi _mask, 0xE7
; ldi _mask, 0xF3
; ldi _mask, 0xFA
ldi _step, 8
step: ; run the LFSR 8 steps
ror _low ; shift lfsr
brcc noMask ; output bit set?
eor _low, _mask ; apply mask
noMask:
dec _step ; done?
brne step ; no, loop
sts lfsr8, _low ; random byte is in _low register
.endMacro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.cSeg
resetHandler:
cli
ldi _high, high(RamEnd)
ldi _low, low(RamEnd)
out SPH, _high
out SPL, _low
ldi _low, 0xff
out DDRA, _low
; setup8BitLFSR
setup16BitLFSR
tryAnotherOne:
; randomByteFrom8BitLFSR
randomByteFrom16BitLFSR
out PORTA, _low
ldi _delay1, 0xFF
outerDelay:
ldi _delay2, 0xFF
innerDelay:
dec _delay2
brne innerDelay
dec _delay1
brne outerDelay
rjmp tryAnotherOne
还有AVR Freaks上的另一个讨论, 提供了几个选项... 但是它们非常难以阅读,因为缺乏任何有意义的标识符,并且其作者拒绝解释。
所以你实际上需要一个子系统,它基于某些几乎随机(或难以预测)的源生成随机数,并且还保持足够的熵。
请记住,系统越简单,提供的随机数就越少。
您可能会对以下内容感兴趣:
C
中实现并轻松移植到ASM
。