Итак, у меня есть задача написать библиотеку для программы, но я застрял в решающей ранней точке, учитель предложил использовать fgets (buf, nr, dest), но fgets не будет позже получать входные данные и помещает (buf) для печати.Назначение сборки AT & T, puts() buffer & stack
Не против комментариев, это на шведском языке, и я написал им для себя, чтобы понять, что должно случиться и как.
Поэтому вызов из главной программы:
.global main
main:
subq $8,%rsp #Gör plats för 8 bytes i 64 bit stacken
movq $headMsg,%rdi #Stoppa in meddelandet $headmsg i stacken rdi
call putText #Lägg texten från buf från dess position i utbufferten
call outImage #Skriv ut strängen som ligger i utbufferten i terminalen
call inImage #Läs in en textrad från tangentbordet till inbuffen för indata och nollställ aktuella pos i buffen
movq $5,count #lägg in 5 bytes i count
Так $ headMsg, который наполнен символами получает положить в стек на% RDI и я могу читать его, если напечатать его в первой функции putText (это не цель этой части), но когда я перехожу в outImage, который является вторым вызовом, я получаю «segmentation fault», поэтому я предполагаю, что значения, которые я пытаюсь скопировать в буфер, будут сброшены при возврате из putText. Должен ли я сохранить его в той части стека, которая не очищается или как вы продолжите, я пробовал несколько разных комбинаций, но я не могу напечатать что-либо, кроме ошибки сегментации в функции OutImage? И я спрашиваю, так как я не могу спросить своего профессора, потому что у нее нет времени, чтобы помочь мне.
#include <stdio.h> #Inkludera standard I/O
.data #Specifiera data
inbuff: .space 64 #Inbuffert, reserverar 64 bytes i minnet (.space går att använda liknande som .skip)
utbuff: .space 64 #Utbuffert, 64 bytes i minnet
buff: .space 64 #Buffert, Samma
buffpos: .quad 0 #Lagrar 64 bitar (.quad liknande .long fast 64 resp 32 bitar)
inpos: .quad 0
utpos: .quad 0
Slut: .asciz "slut\n"
.text #Innehåller programkod
.global inImage #Gör funktionerna globala
.global getchar #så att de kan anropas i Mprov
.global getInPos
.global setInPos
.global putChar
.global putText
.global getint
.global setOutPos
.global getOutPos
.global putInt
.global outImage
.global getText
.global getInt
Clearbuffer:
#movq $buff,%eax
#movq $0,%ebx
inImage:
#läser in en ny textrad från tangentbordet till er inläsningsbuffert för indata och nollställer
#positionen till den aktuella bufferten. Andra inläsningsrutiner kommer sedan att jobba mot den här
#bufferten. Om positionen står vid buffertens slut när någon av de andra inläsningsrutinerna nedan
#anropas ska inimage anropas automatiskt (i den aktuella rutinen), så att det alltid finns data att
#arbeta med.
#movq $inpos, $0 #Nollställ inpos
movq $inbuff, %rdi #Lägg i inbuff, där inbuff är en bit reserverat minne(register destination index)
movq $5,%rsi #Högst 5-1=4 tecken (NULL räknas ju också)(rsi=register source index)
movq stdin, %rdx #Från standard input stdin=$0 om ej def.(rax/rdx= return value)
call fgets
getInt: #Returnerar ett heltal, tolkar en sträng som omvandlas till en int när positionen i bufferten
#påträffas(ett tecken som inte kan ingå i ett heltal.)
getText: #Överför n tecken från aktuell position, returnera antalet verkligt överförda tecken
getChar: #Returnerar ett tecken och flyttar fram aktuell position ett steg
getInPos: #Returnera aktuell buffertposition för inbufferten
setInPos: #Sätt aktuell buffertposition för inbufferten till n. n måste dock ligga i intervallet [0,MAXPOS].
#Om n<0 sätt den till 0, om n>MAXPOS sätts den till MAXPOS.
outImage: #Skriv ut strängen i utbufferten i terminalen. Om någon av nedanstående utdatarutiner når
#buffertens slut så ska ett anrop till outimage göras automatiskt så att man får en tömd
#utbuffert att jobba mot.
movq $utbuff, stdout
call puts
putInt: #lägg ut talet n som sträng i utbufferten från och med den aktuella positionen.
#Glöm inte att uppdatera aktuell position.
putText: #Lägg texten som finns i buf från och med den aktuella positionen i utbufferten.
#subq $8, utbuff #lägg in buf i utbufferten
popq utbuff
call puts
ret
#movq %rdi, utbuff
#addq $1,$utpos #Uppdatera aktuell position i utbuff
putChar: #Lägg tecknet c i utbufferten och flytta fram aktuell position ett steg.
#rensa stackarna
#movb 8(%rbp), %bl #Lägg in en 8 bitar i rbp lower
#movq $utbuff,%rcx #
#movq $utpos,%rax #uppdatera position(+1)(Inc)
getOutPos: #Returnera aktuell buffertposition för utbufferten
setOutPos: #Sätt aktuell buffertposition för utbufferten till n.
#n måste dock ligga i intervallet[0,MAXPOS]. Om n<0 sätt den till 0, om n>MAXPOS sätts den till MAXPOS.
Благодарен за помощь!
BR Rickard
Вы не передаете аргументы 'puts', следовательно, ошибку. Вам понадобится 'movq $ inbuff,% rdi', чтобы напечатать содержимое' inbuff', которое вы только что прочитали. Также удалите 'popq utbuff; call puts', потому что в текущем состоянии кода это не имеет смысла и вызовет дополнительную ошибку. – Jester
Извините, что я не очень ясен, но пока я еще не включен. Я только что сделал то, что мог, чтобы облегчить это позже. То, с чем я борюсь, это часть outImage, которая должна содержать $ headMsg, но вместо этого я получаю Segmentation Fault. Я получил строгие ограничения на использование разных функций для отдельных вещей. – ricksson
То, что я сказал, относится к 'outImage'. Конечно, вы можете использовать '$ utbuff'. – Jester