【发布时间】:2021-03-16 20:18:50
【问题描述】:
这是一个从系统时钟创建随机数字的简单项目。它需要一个数字,将其转换为数字,然后添加 48,以便在 ASCII 表中匹配。我遇到的问题是它不打印任何东西。据我所知,它需要是一个字符串才能考虑打印。有没有办法可以“投射”它?是的,我知道,它是一个整数,但假装它在 ascii 表上?这是我的代码供参考。除“prnt_clock”外,一切正常。最后一件事,我不能使用任何 C 代码/函数,所以不,我不能使用 printf。
.global rand
.equ STDOUT, 1
.equ WRITE, 4
rand:
PUSH {LR}
BL get_clock
LDR R1, =time
ADD R1, R1, #5
LDRB R0, [R1]
BL num_to_digit
ADD R0, R0, #48
MOV R1, R0
BL prnt_clock
B rand_leave
get_clock:
MOV R7, #78 @ Get time of day
LDR R0, =time @ address of holder for time_t
MOV R1, #0 @ time zone not needed
SWI 0
MOV PC, LR
// Assumes the number is in R0
num_to_digit:
CMP R0, #9 @ Compare num to 9
SUBGT R0, R0, #10 @ If greater than, substract 10
BGT num_to_digit @ Repeat until its eq or lower than 9
MOV PC, LR @ Comeback to main
prnt_clock:
MOV R0, #STDOUT @ Print to terminal
MOV R2, #1 @ Print only the digit
MOV R7, #WRITE @ Write Syscall
@MOV R3, #0 @ Create a counter
SWI 0
rand_leave:
POP {LR}
MOV PC, LR
.data
time: .space 9
【问题讨论】:
-
您需要将整数(ascii char)存储在内存中并传递其地址。见 man 2 写。
-
那么我如何将它存储在内存中呢?我是否制作一个充满空格的标签 asciz 然后将其存储在里面?老实说,我不知道我该怎么做。我试过STR和LDR。但我找不到将整数存储在内存中的方法/
-
是的,分配一个静态缓冲区会起作用。它不必以零结尾,如果它是单个数字(字符),您可以使用
STRB。您也可以将其推送到堆栈并传递其地址(但之后不要忘记清理它)。 -
重复减法对于 div/remainder 来说是一种非常慢的算法,尤其是对于像 10 这样的小除数。请参阅 How do I print an integer in Assembly Level Programming without printf from the c library? 了解 C 算法和 x86 Linux asm 实现。您可以编译 C 以获得 ARM 代码,并将堆栈空间缓冲区处理从我的 x86 asm 调整到 ARM。
标签: assembly raspberry-pi arm raspbian