如何从ARMSIM中的标准输入中获取整数#(不使用scanf?)

时间:2016-03-02 19:39:19

标签: assembly arm

所以我一直在谷歌上搜索两天而没有运气这个问题。我正在使用ARMSIM#并且在手册中没有解释如何从Stdin获取整数,更不用说如何使用它了!有没有一种更简单的方法可以在不使用scanf的情况下完成它?如果没有,我该如何使用scanf?我不知道能够使用scanf的语法(或库调用?),它给我一个“未知符号错误”。

* MODS,请不要将此thread作为答案进行链接。它不起作用。

1 个答案:

答案 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>