LINUX.ORG.RU

aarch64 cortex a-53 чтение из Файла

 


0

1

здрасьте здрасьте

исправте ошибку в коде уважаемые форумчане, чтобы программа могла читать из файла

.section .bss
buff: .space 12
.section .data 
file: .asciz "f.txt"

.global main

main:
sub sp, sp #128
mov x8, #65
ldr x0, =file
mov x1, 0x002
mov x2, 0x1b6
mov x3, #12
svc 0

mov x8, #63
ldr x1, =buff
mov x2, #12
svc 0

mov x8,#64
mov x0, #1
ldr, =buff
mov x2, #12
svc 0
add sp, sp, #128
ret



очень нужна ваша помощь

program test
implicit none
character(LEN=:), allocatable :: str
integer :: file_size

open(UNIT=10, FILE='info.txt', FORM='UNFORMATTED', ACCESS='STREAM')

inquire(10, SIZE=file_size)
allocate(character(LEN=file_size) :: str)

read(10) str
close(10)

print '(A)', str
end program

>> gfortran -Wall -Wextra -pedantic -std=f2003 test.F90
Gennadevich
()
Ответ на: комментарий от Gennadevich

скажите, что нужно исправить... я не понял к сожалению

Assembler
() автор топика
Ответ на: комментарий от Gennadevich

Какой вопрос, такой и ответ.

Надо будет как-нибудь подучить Фортан, я думаю, они с Сишечкой подружатся.

anonymous
()
Ответ на: комментарий от Assembler

мне думается функция open корень проблемы.

Нет, корень проблемы – sqrt. Ты что, математику в школе не учил?

anonymous
()
Ответ на: комментарий от Assembler

Тут когда не знают, то начинают оскорблять

anonymous
()
Ответ на: комментарий от Assembler

Мой тебе совет задай этот вопрос в другом месте. Это не форум разработчиков а клоунов.

anonymous
()
Ответ на: комментарий от i-rinat

да. не могу найти номер системного вызова open() для aarch64. #65 это я взял наугад. решил что если write 4 в x86 а в assemblere 64, то open() в x86 имеет номер 5, значит arm64 может быть 65. но это неточно

Assembler
() автор топика
Ответ на: комментарий от Assembler

не могу найти номер системного вызова open() для aarch64

А ты уверен, что он есть?

$ echo -e '#include <sys/syscall.h>' | aarch64-linux-gnu-gcc-10 -E -dM -x c - | grep NR_open
#define __NR_openat 56
#define SYS_openat __NR_openat
#define __NR_open_tree 428
#define __NR_open_by_handle_at 265
#define __NR_openat2 437
#define SYS_open_tree __NR_open_tree
#define SYS_open_by_handle_at __NR_open_by_handle_at
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

я просто загуглил: linux syscall table aarch64

Хотя наверное ты прав, открыл другую таблицу:https://fedora.juszkiewicz.com.pl/syscalls.html

там говорят нет open для arm64.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

В чём прикол заниматься писаниной на асме, когда есть clang с прекрасной кросс-компиляцией, asm оптимизированный он тоже выдаёт

menangen ★★★★★
()
Ответ на: комментарий от menangen

Избранные теги: js, lua, node.js, python, scala, swift

В чём прикол заниматься писаниной на асме, когда есть clang с прекрасной кросс-компиляцией, asm оптимизированный он тоже выдаёт

Ты не поймешь, можешь даже не пытаться.

anonymous
()
Ответ на: комментарий от i-rinat

скажите пожалуйста, как посмотреть таблицу системных вызовов в ядре своей операционной системы? она же где-то лежит

Assembler
() автор топика
Ответ на: комментарий от sanwashere

да, огромное спасибо форум за помощь

Assembler
() автор топика
Ответ на: комментарий от Assembler

Номер системного вызова openat() привёл i-rinat, а перевести его в семантику open() за счёт указания AT_FDCWD качестве значения для параметра dirfd можно просто ознакомившись с man 2 openat.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Ответ на: комментарий от Assembler

она же где-то лежит

Я не думаю, что где-то в исходниках лежит именно таблица вызовов. Представь, что ты сам реализуешь системные вызовы. И вот ты внезапно решил оформить таблицу, где перечисляешь все системные вызовы по номерам. Как тебе это поможет?

i-rinat ★★★★★
()
Ответ на: комментарий от Assembler

man 2 openat

int openat(int dirfd, const char *pathname, int flags, mode_t mode);
...
Если  в  pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как open(2)).

И сам AT_FDCWD:
$ echo '#include <fcntl.h>' | gcc -E -dM -x c - | grep AT_FDCWD
#define AT_FDCWD -100

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Ответ на: комментарий от i-rinat

ну видите, на некоторых архитектурах номера системных вызовов очень специфичны. чтобы каждый раз не задавать тут вопросы, лучше уметь работать с таблицей. а так программа отработала. спасибо всем за помощь

Assembler
() автор топика
1 марта 2021 г.
Ответ на: комментарий от Assembler

Таблица SYSCALL

Зачем в своём коде использовать цифровые номера syscall'ов? Чтобы реже на кнопки нажимать?

Для «таблички» уже подсказали один способ:

aarch64-linux-gnu-cpp -E -dM  << LOR | grep -e '__NR'
#include <sys/syscall.h>
LOR
Если для «родной» архитектуры, то просто cpp вместо aarch64-linux-gnu-cpp .

vM ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.