所以我一直在谷歌上搜索两天而没有运气这个问题。我正在使用ARMSIM#并且在手册中没有解释如何从Stdin获取整数,更不用说如何使用它了!有没有一种更简单的方法可以在不使用scanf的情况下完成它?如果没有,我该如何使用scanf?我不知道能够使用scanf的语法(或库调用?),它给我一个“未知符号错误”。
* MODS,请不要将此thread作为答案进行链接。它不起作用。
答案 0 :(得分:1)
装配完全不同于C(scanf,...)。汇编直接在芯片上工作,直接使用寄存器和外设(寄存器,ALU,GPIO,TWI等接口......)
有关示例,请参阅此帖子Assembly: Read integer from stdin, increment it and print to stdout
这是针对IA32汇编程序的,ARM汇编程序又是不同的,即从stdin读取的系统调用还有另一个数字,......
在这个线程中是ARM汇编程序:Reading and Printing a string in arm assembly
要从ARMSIM中的文件读取整数,请使用系统调用 SWI 0x6a (STDIN在内部被视为文件,在大多数情况下(始终)具有FD0)
STDIN的文件句柄(文件描述符)为 0
在这个git中有一些武器代码,但它未完成(有问题)https://github.com/lseelenbinder/armsim/blob/master/test_files/sim2/sim2os/armos.c < -errors注意
在以下代码中,pdf http://cas.ee.ic.ac.uk/people/gac1/Architecture/Lecture10_5.pdf用作ARM SWI(系统调用)的参考
根据这个pdf,SWI 0x6a从文件句柄中读取给定的字节数。现在输入的编码很重要,通常是KeyCode,请参阅此http://cas.ee.ic.ac.uk/people/gac1/Architecture/Lecture10_5.pdf和此http://www.theasciicode.com.ar/(对于大写字母和数字KeyCode和ASCII是相同的) 因此当键盘上的一个键是STDIN中出现1个字节时 所以数字1,2,3,4,5,6,7,8,9,0都包含1个字节(参见KeyCode / ASCII表)。如果要读取4位数字,则必须读取4个字节
AREA read_from_stdin, CODE
.equ SWI_Open, 0x66 ;open a file
.equ SWI_Close,0x68 ;close a file
.equ SWI_PrChr,0x00 ; Write 1 byte to file handle
.equ SWI_RdBytes, 0x6a ; Read n bytes from file handle
.equ SWI_WrBytes, 0x69 ; Write n bytes to file handle
.equ Stdin, 0 ; 0 is the file descriptor for STDIN
.equ Stdout, 1 ; Set output target to be Stdout
.equ SWI_Exit, 0x11 ; Stop execution
ENTRY
START mov R0,#0 ; the file handle from that is read has to be in R0 the file handle for STDIN is 0
adr R1, =buffer ; load address of the buffer in which is read to R1
mov R2,#4 ; read 4 bytes for a 4 digit number (4 characters)
swi 0x6a ; invoke system call 0x6a
; now type a number, the corresponding KeyCode should appear in buffer
; to print the content of buffer do
mov R0,#1 ; write to stdout
adr R1, =buffer ; move address of buffer in R1 to write the content of buffer
mov R2,#4 ; write 4 bytes (4 characters)
swi 0x69 ; invoke system call 0x69
; this should write the content of buffer you typed to stdout
buffer % 4 ; reserve buffer 4 byte
END
可能这包含语法错误,我只知道ARM程序集而不是ARMSIM#
这个问题是从stdin读取4个字节(char)并不会使这4个字节成为int(https://en.wikipedia.org/wiki/Integer_(computer_science))。当一个键在键盘上是笔划时,在STDIN中出现KeyCode- / ASCII编码的字符,你必须对它们进行int ...(我会跳过所有最初都没有数字的ASCII字符......)< / p>