Как правильно использовать функцию malloc в сборке руки для открытия файлов? - PullRequest
0 голосов
/ 08 мая 2019

Я работаю над школьным проектом по сборке рук с использованием Raspberry Pi.Моя цель - открыть входной файл и вычислить контрольную сумму, просто посчитав символ ASCII во входном файле.Затем откройте выходной файл, который напишет то же сообщение, но добавит значение ASCII в конце текста.Мой профессор просит динамически выделять память для входных и выходных массивов.У меня вопрос, как бы я поступил так, потому что он никогда не показывал нам, как это использовать.Я исследовал, как использовать его в C, но мне трудно применить эти знания для сборки оружия.

Я просмотрел лист из того, что мой профессор разместил в Интернете, но, похоже, это совсем не помогает.Все, что он показывает, это

in n = 500;   
/* example  n has value of 500 */

dbptr = (char *) malloc(n)  
/* will allocate 500 bytes and dbptr will be the pointer to the beginning of 
the dynamically allocated array/buffer */

. Что бы мне ни пришло в голову, я бы открыл файл.Затем поместите размер строки в переменную и вызовите malloc с переменной в качестве параметра?

.data
disInput:   .asciz  "Enter input file name: "
disOutput:  .asciz  "\nEnter output file name: "
disHash:    .asciz  "Enter hash seed: "
disOptions: .asciz  "\nGet checksum(1) or check integrity(2)?: "
disDone:    .asciz  "Checksum calculated!"
disSafe:    .asciz  "Integrity passed. File is safe."
disBad:     .asciz  "Integrity failed. File is not safe."
disNoFile:  .asciz  "No file exists"
disEmpty:   .asciz  "Empty file"
disWrong:   .asciz  "You entered a bad option\n"
formOption: .asciz  "%d"
formInFile: .asciz  "%s"
formOutFile:.asciz  "%s"
formHash:   .asciz  "%d"
inputFile:  .asciz  ""
outputFile: .asciz  ""
hashSeed:   .int    0
option:     .int    0

    .text
    .global main

main:
    push {ip,lr}
    b menu

menu:
    @ask user to enter input file name
    ldr r0,=disInput
    bl  printf

    @user input for file name
    ldr r0,=formInFile
    ldr r1,=inputFile
    bl  scanf

    @open file and check if empty or if it exists


    @ask user to enter hash seed
    ldr r0,=disHash
    bl  printf

    @user input for hash seed
    ldr r0,=formHash
    ldr r1,=hashSeed
    bl  scanf

    @ask user for option of get checksum or check integrity
    ldr r0,=disOptions
    bl  printf

    @user input for option
    ldr r0,=formOption
    ldr r1,=option
    bl  scanf

    @branch depending on user option
    ldr r4,=option
    ldr r5,[r4]
    cmp r5,#1
    beq option1
    cmp r5,#2
    beq option2
    b   wrongOption

option1:
    @ask user to enter output file name
    ldr r0,=disOutput
    bl  printf

    @user input for output file name
    ldr r0,=formOutFile
    ldr r1,=outputFile
    bl  scanf

    @branch to calculate checksum

option2:
    @
    ldr r0,=disDone
    bl  printf

wrongOption:
    @when user enters the wrong option
    ldr r0,=disWrong
    bl  printf
    b done

calculate:
    @where checksum is calculated

    @if option 1 then branch to done


done:
    mov r0,#0
    pop {ip,pc}
    .end

Вот мой код для проекта на тот случай, если он поможет.Извините, если он требует слишком многого, но я исследовал его повсюду, и помощь в сборке рук не слишком велика.Спасибо!

1 Ответ

1 голос
/ 08 мая 2019

Я открываю файл.Затем поместите размер строки в переменную

Какая строка?Открытие файла не дает вам строку, он дает вам дескриптор файла (целочисленный «дескриптор», который вы можете передать на будущие вызовы read и / или write).

Если у вас былстрока с длиной уже будет в памяти, и вам не нужно будет выделять для нее больше места.

Что вам нужно сделать, это выяснить длину файла и передайте это как аргумент malloc.Это, конечно, тривиально, укажите в r0 и bl malloc.Вам не нужно сохранять / перезагружать его из какой-либо именованной переменной, просто убедитесь, что он скопирован в регистр, сохраняющий вызов, потому что вам, вероятно, понадобится и длина файла позже.


Если выограниченный функциями библиотеки ISO C, вместо POSIX open / fstat, вы можете использовать fseek / ftell, чтобы узнать, как долго файл хранится.

Но так как вы программируете вasm, вы do знаете, для какой ОС и процессора вы пишете, поэтому вы можете использовать stat перед открытием или fstat после открытия, чтобы найти длину файла.


Вам не нужно выделять место для всего размера файла : вы можете прочитать 4k, обработать его, написать 4k, а затем прочитать еще 4k.

В конце выможете добавить все, что вы рассчитали на лету.Если вам нужно отсортировать или перевернуть строки файла, вам нужно будет загрузить все это.(Или работать партиями с алгоритмом внешней сортировки).Но вы описали свой расчет как «контрольную сумму», поэтому данные файла копируются без изменений, и вам просто нужно добавить.Вы в идеальном положении, чтобы сделать это после последнего чтения + записи.

...