Program sederhana ini mengalami kesalahan saat saya mencoba menggunakan fgets. Saya telah mencoba menggunakan fungsi baca dengan
ldr r1, =input_string
mov r3, #80
mov r0, #0
bl read
tapi ini gagal dengan
read(0, 0x21044, 3201061676) = -1 EINVAL (Argumen tidak valid)
Jadi saya mencoba menggunakan fgets. Sepertinya ada yang salah dengan buffer string saya?
.data
.balign 4
message1: .asciz "Please type a string: \n"
.balign 4
input_string:
.asciz ""
.zero 80
return: .word 0
.text
.global main
main:
push {lr}
ldr r0, =message1
bl printf
mov r0, #0
bl fflush
ldr r0, =input_string
mov r1, #80
mov r2, #0
bl fgets
mov r0, r1
bl printf
pop {lr}
bx lr
.end
.global printf
.global read
.global fgets
EDIT: Saya mencoba menggunakan stdin sesuai contoh yang diberikan dalam komentar, tetapi ini gagal dikompilasi dengan mengatakan: Kesalahan: ekspresi langsung memerlukan # awalan -- `mov r2,=stdin'
ldr r0, =input_string mov r1, #80 mov r2, =stdin ldr r2, [r2]
Sepertinya tidak ada makro yang ditentukan sebelumnya untuk stdin seperti di C, jadi bagaimana cara menyuruhnya menggunakan stdin?
NULL
untukFILE*
argumen ke-3 darifgets
? man7.org/linux/man-pages/man3/fgets.3. htmlread
menggunakan deskriptor file Unix (sebagai argumen pertama),fgets
menggunakan stdioFILE*
sebagai argumen terakhir. - person Peter Cordes   schedule 29.09.2020fgets
. - person Peter Cordes   schedule 29.09.2020read
Anda melewati panjangr3
, argumen ke-4 yang tidak ada, bukanr2
(argumen ke-3). Selain itu, di asm, cukup umum untuk memasukkan instruksi panggilan sistemsvc
alih-alih memanggil pembungkus libc. (Dengan nomor panggilan di R7, IIRC). Tapi Anda tidak perlu melakukan itu. - person Peter Cordes   schedule 29.09.2020FILE *stdin
adalah variabel penunjuk global yang diinisialisasi oleh kode startup libc untuk menunjuk pada structFILE
. Saya berharap itu berhasil, setidaknya jika Anda melakukanldr r2, =stdin
bukanmov
. Lihatlah keluaran kompiler C (godbolt.org) - person Peter Cordes   schedule 29.09.2020