299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
||||||
1 | ||||||
NASM Ошибка при компиляции программы типа HelloWorld03.07.2018, 22:59. Показов 4512. Ответов 45
Метки нет (Все метки)
подскажите еще пожалуйста
0
|
03.07.2018, 22:59 | |
Ответы с готовыми решениями:
45
Ошибка при компиляции программы типа HelloWorld Перечисления фиксированного типа ( enum-base ). Ошибка при компиляции Ошибка при компиляции программы Ошибка при компиляции программы |
Ушел с форума
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
|
|||||||||||
04.07.2018, 06:32 | 2 | ||||||||||
pcmax,
4
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
04.07.2018, 17:59 [ТС] | 3 |
ребята вот такое выдает , когда скомпелированный файл пытаюсь запустить
Код
segmentation fault (core dumped)
0
|
Ушел с форума
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
|
|
04.07.2018, 18:05 | 4 |
pcmax,
укажи строки, которыми ты компилируешь и линкуешь
0
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
||||||
04.07.2018, 19:07 [ТС] | 5 | |||||
вобщем ребята, не просто Ассемблер хочет чтобы я использовал определенные регистры, он еще требует, чтобы я их располагал в определенном порядке.
делаю так
Код
nasm -f elf64 file.asm ld file.o -o outname ./uotname
0
|
Модератор
|
|
04.07.2018, 21:10 | 6 |
_start это метка, нужно добавить двоеточие _start: .Добавлено через 1 минуту И кроме того, этот код для 32-разрядного Linux. В x64 другие регистры - 64-разрядные. Добавлено через 5 минут А что такое Какой вариант не работает?
0
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
04.07.2018, 21:40 [ТС] | 7 |
я пробовал компилить и под 32 разрядную ось. та же песня.
вобщем если заношу var в eax вместо edx то не работает. Код
mov edx, 4 mov ebx, 1 mov eax, var mov ecx, len
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
04.07.2018, 22:05 | 8 |
Сообщение было отмечено pcmax как решение
Решение
Так ты (в твоем случае) в регистры заносишь данные не чтобы хранить. А чтобы через эти регистры передать параметры системному вызову int 0x80. Когда ты вызываешь функцию операционной системы через int 0x80 то в регистр eax ты должен помещать номер системной фунции, которую вызываешь. Если eax = 4 , то ты через int 0x80 вызовешь системную функцию записи write(). Но тогда ей нужно передать параметры - откуда брать данные для записи, сколько байт писать и куда писать.
Так вот в ebx надо поместить дескриптор (хандлер, файловый манипулятор, можно называть по разному) файла или потока куда писать, в ecx адрес, начиная с которого брать данные для записи и в edx сколько байт писать. В твоем случае запись идет в файловый манипулятор 1, а это зарезервированный манипулятор стандартного потока вывода stdout Короче, нельзя значения этих регистров как попало переставлять перед системных вызовом. Ты же операционной системе мозги откомпостируешь неверным номером функции и нелепыми параметрами. Ты ведь заносишь значения в регистры не для себя, а перед вызовом функции ОС для нее.
2
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
04.07.2018, 23:12 [ТС] | 9 |
так вот я и не могу понять, почему не могу вызвать функцию из edx?
почему она не может взять параметры из abx? ведь это общие регистры
0
|
Модератор
|
|
04.07.2018, 23:57 | 10 |
Сообщение было отмечено pcmax как решение
Решение
pcmax, чтобы понять причины - сделайте собственную функцию деления двух чисел, передаваемых в двух регистрах. Деления - чтобы избежать свойства коммутативности (как у сложения).
И теперь вызывайте её, передавая параметры в разных регистрах и объясняйте - почему результат неверный. Это не шутка. Действительно сделайте именно так. Добавлено через 3 минуты Не по теме: И ещё. Подозреваю, что вы троллите пользователей.
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||||||||||||
05.07.2018, 08:00 | 11 | |||||||||||||||
Сообщение было отмечено pcmax как решение
Решение
pcmax, начнём с того, что адрес строки для функции 4 заносится в ECX, а длина – в EDX, а не наоборот.
Во-вторых, для 64 бит используются другие регистры (не только RAX вместо EAX, но и вообще порядок параметров другой: не EAX, EBX, ECX, EDX, ESI, EDI, EBP, а RAX, RDI, RSI, RDX, R10, R8, R9). Ну и в-третьих, когда линкуешь, надо тоже платформу указывать: Код
nasm -f elf32 file.asm ld -m elf_i386 -s file.o -o outname
Добавлено через 10 минут По функциям. Для 32-х бит:
1
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
05.07.2018, 08:49 | 12 |
Потому-что эта функция читать мысли не умеет и узнать про твои хотелки не может. Она ожидает номера функции в регистре eax. Она так написана.
3
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
05.07.2018, 12:49 [ТС] | 13 |
вот -вот ребята я и хочу понять, что у каждого регистра из группы "общие" свое назначение. и они не взаимозаменяемые
ок
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
05.07.2018, 13:25 | 14 |
Они общие, но отдельные операции привязаны к конкретным регистрам. А как иначе?
Когда ты пишешь cdq , используются именно eax и edx.Когда пишешь div – (e)ax и (e)dx (например).loop использует именно (e)cx.А для стека используется регистр общего назначения (e)sp. Для обращения к параметрам обычно используют ebp (хотя тут есть поле для творчества). Параметры в Windows x64 передаются через rcx, rdx, r8, r9. В Linux – я уже писал выше (но это было для системных вызовов, а для обычных функций вместо r10 используется rcx, но для syscall регистр rcx, опять же, имеет особое назначение).Регистры общего назначения, которые должны сохранятся в функциях Windows 32 - ebx, esi, edi, ebp, (и esp, конечно же). И т.д. Добавлено через 21 секунду Кстати, в Linux x64 используется не int 0x80 , а syscall (не путать с sysenter ).
2
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
05.07.2018, 18:16 [ТС] | 15 |
вобщем тут мне еще учиться и учиться
спасибо Добавлено через 4 часа 20 минут помогите еще разобраться. думал , что сам смогу, но не получается. Код
len equ $ - var подругому не получается прочитать это выражение ну что -то как -то я криво да неправильно это делаю
0
|
Ушел с форума
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
|
||||||
05.07.2018, 19:17 | 17 | |||||
pcmax,
знак "доллар" означает "от текущего адреса"
1
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
05.07.2018, 19:30 [ТС] | 18 |
раньше до Ассемблера, я думал, что нет ничего лучше, чем обнять любимую девушку.
теперь , когда я начал изучать ассемблер, то считаю, что нет ничего лучше, чем получить ответ на вопрос связанный с синтаксисом этого языка.
0
|
Ушел с форума
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
|
|
05.07.2018, 19:37 | 19 |
pcmax,
открой для себя учебники и читальный зал, они идут сразу за жаренным мясом и красным вином в компании с веселыми девушками
2
|
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
|
|
05.07.2018, 21:05 [ТС] | 20 |
это ж я так думал, а на самом деле их никогда у меня не было. из-за этого видимо я так думал, что нет ничего лучше, чем обнять, то чего нет) ну то есть любимую девушку. ну а теперь у меня есть Ассемблер.
а какой учебник лучше взять касаемо Nasm?
0
|
05.07.2018, 21:05 | |
05.07.2018, 21:05 | |
Помогаю со студенческими работами здесь
20
Ошибка при компиляции программы Ошибка при компиляции программы Ошибка при компиляции программы Ошибка при компиляции программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |