Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
1
NASM

Ошибка при компиляции программы типа HelloWorld

03.07.2018, 22:59. Показов 4512. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите еще пожалуйста
Assembler
1
2
3
4
5
6
7
8
section .data
        slovo dw "hi forum"
       
section .text
        ;описывают, что регистры edx и eax -общие и могут заменять друг друга, но как только если я пытаюсь поместить 
 
       mov eax, slovo ; - то ошибка
       mov edx, slovo ; - программа работает
что не так? ведь это общие регистры. почему я не могу хранить адрес(slovo) в любом из этих регистров?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2018, 22:59
Ответы с готовыми решениями:

Ошибка при компиляции программы типа HelloWorld
Не компилится, ругается на mov dx, hello format pe64 mov ax, cs mov ds, ax mov dx, hello ...

Перечисления фиксированного типа ( enum-base ). Ошибка при компиляции
Если я правильно понимаю, следующий enum ( далее — енум ): enum : < type > { < CONST_NAME > }; ,...

Ошибка при компиляции программы
Написал код,начал компилировать в Dev-C++ (v. 4.9.9.2),он отказался компилировать,пишет что...

Ошибка при компиляции программы
не могу понять что за ошибка.. уже все перепробовал..

45
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
04.07.2018, 06:32 2
pcmax,
  1. slovo dw "hi forum" -- строка из слов, хотя это строка из байтов и должно быть slovo db "hi forum",0 а строка должна быть ограничена нуль-терминатором
  2. команды
    Assembler
    1
    2
    
     mov eax, slovo
     mov edx, slovo
    помещают в регистры eax и edx адрес строки "hi forum" и должны работать. Скорее всего у тебя какие-то проблемы с набором команды, возможно, что в команде есть буква кириллицы. Но лучше всего если бы ты привел текст ошибки который выдал компилятор. А то получается гадание на хрустальном шаре
  3. как варианты получения адреса можно использовать еще и
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    
     lea eax,[slovo]
     lea ebx,[slovo]
     lea ecx,[slovo]
     lea edx,[slovo]
     lea edi,[slovo]
     lea esi,[slovo]
     lea ebp,[slovo]
     lea esp,[slovo]
4
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
04.07.2018, 17:59  [ТС] 3
ребята вот такое выдает , когда скомпелированный файл пытаюсь запустить
Код
segmentation fault (core dumped)
ну это когда пытаюсь занести в регистр edx вместо eax
0
Ушел с форума
Автор FAQ
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
вобщем ребята, не просто Ассемблер хочет чтобы я использовал определенные регистры, он еще требует, чтобы я их располагал в определенном порядке.
делаю так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
section .data
        var db "i love assembler"
         len equ $ -var
section .text
          global _start
_start
 
         mov eax, 4
         mov ebx, 1
         mov edx , var
         mov ecx , len
         int 0x80
         mov eax, 1
         mov ebx, 0
         int 0x80
Код
nasm -f elf64 file.asm
ld file.o -o outname
./uotname
все работает , если не менять регистры местами и заносить только так. ребята, почему?
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
04.07.2018, 21:10 6
_start это метка, нужно добавить двоеточие _start:.

Добавлено через 1 минуту
И кроме того, этот код для 32-разрядного Linux.
В x64 другие регистры - 64-разрядные.

Добавлено через 5 минут
А что такое
Цитата Сообщение от pcmax Посмотреть сообщение
все работает , если не менять регистры местами и заносить только так. ребята, почему?
Какой вариант не работает?
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
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
04.07.2018, 23:57 10
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

pcmax, чтобы понять причины - сделайте собственную функцию деления двух чисел, передаваемых в двух регистрах. Деления - чтобы избежать свойства коммутативности (как у сложения).
И теперь вызывайте её, передавая параметры в разных регистрах и объясняйте - почему результат неверный.

Это не шутка. Действительно сделайте именно так.

Добавлено через 3 минуты

Не по теме:

И ещё. Подозреваю, что вы троллите пользователей.
Если осознание причин к вам не придёт - закрою тему, во избежании наказания других людей, у которых может кончиться терпение.

1
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
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
Вот так должно работать.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bits 32
 
section .data
         var db `i love assembler\n`
         len equ $ -var
 
section .text
          global _start
_start:
 
         mov eax, 4
         mov ebx, 1
         mov ecx, var
         mov edx, len
         int 0x80
 
         mov eax, 1
         mov ebx, 0
         int 0x80
p.s. Надо дописать, наконец, статью на эту тему, всё руки не доходят...

Добавлено через 10 минут
По функциям.
Для 32-х бит:
Assembler
1
2
3
%define sys_exit            1
%define sys_read            3
%define sys_write           4
Для 64-х бит:
Assembler
1
2
3
%define sys_read            0
%define sys_write           1
%define sys_exit            60
p.s. Для Linux есть отдельный подраздел...
1
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
05.07.2018, 08:49 12
Цитата Сообщение от pcmax Посмотреть сообщение
так вот я и не могу понять, почему не могу вызвать функцию из edx?
почему она не может взять параметры из abx?
Потому-что эта функция читать мысли не умеет и узнать про твои хотелки не может. Она ожидает номера функции в регистре eax. Она так написана.
3
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
05.07.2018, 12:49  [ТС] 13
вот -вот ребята я и хочу понять, что у каждого регистра из группы "общие" свое назначение. и они не взаимозаменяемые
ок
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
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
тут значит что len эквивалентно $ -var. знак доллара значит что len будет числовым и "-" этот знак минус значит что надо из $ вычесть var.

подругому не получается прочитать это выражение
ну что -то как -то я криво да неправильно это делаю
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
05.07.2018, 19:09 16
$ - это текущая позиция.
Текущая позиция минус var = длина var (того, что от var до текущего места).
1
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
05.07.2018, 19:17 17
pcmax,
знак "доллар" означает "от текущего адреса"
Assembler
1
2
3
var db `i love assembler\n`<-- в строке var 18 символов
         len equ $ - var <--  $=var+18
от текущего адреса отнять адрес начала строки  $ - var=(var+18) - var=18, то есть len=18
1
299 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,265
05.07.2018, 19:30  [ТС] 18
раньше до Ассемблера, я думал, что нет ничего лучше, чем обнять любимую девушку.
теперь , когда я начал изучать ассемблер, то считаю, что нет ничего лучше, чем получить ответ на вопрос связанный с синтаксисом этого языка.
0
Ушел с форума
Автор FAQ
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2018, 21:05
Помогаю со студенческими работами здесь

Ошибка при компиляции программы
Здравствуйте. Помогите, пожалуйста, найти ошибку в программе. Заранее спасибо. #include...

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

Ошибка при компиляции программы
Fatal: Illegal option: 07)\FastReport\LibBCB6;c:\program files...

Ошибка при компиляции программы
Чет в коде ошибка )хз какая) то на однерку ругается переписываю норм потом на на др. а потом вообще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru