2015-09-04 3 views
0

Итак, у меня есть задача написать библиотеку для программы, но я застрял в решающей ранней точке, учитель предложил использовать 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

+1

Вы не передаете аргументы 'puts', следовательно, ошибку. Вам понадобится 'movq $ inbuff,% rdi', чтобы напечатать содержимое' inbuff', которое вы только что прочитали. Также удалите 'popq utbuff; call puts', потому что в текущем состоянии кода это не имеет смысла и вызовет дополнительную ошибку. – Jester

+0

Извините, что я не очень ясен, но пока я еще не включен. Я только что сделал то, что мог, чтобы облегчить это позже. То, с чем я борюсь, это часть outImage, которая должна содержать $ headMsg, но вместо этого я получаю Segmentation Fault. Я получил строгие ограничения на использование разных функций для отдельных вещей. – ricksson

+0

То, что я сказал, относится к 'outImage'. Конечно, вы можете использовать '$ utbuff'. – Jester

ответ

0

Спасибо за помощь! Я предполагаю, что я использовал popq неправильно. А также добавив ret, чтобы программа работала лучше. Я продолжу работу над этим и создаю новый пост, если у меня возникнет другая проблема.

movq $utbuff, stdout 
call puts 
ret 

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. 

movq %rdi, utbuff 
ret