Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4

Первая программа

09.10.2010, 10:16. Показов 7595. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Начал учить Assembler, написал первую программу:
Assembler
1
2
3
4
mov ax, 8
mov cx, 6   
mov dx, cx  
add dx, ax
При компиляции в NASM выводит ошибку:

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048060
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2010, 10:16
Ответы с готовыми решениями:

Первая программа
Всем привет! Вопрос: почему программа не выводит сообщение? Ведь когда открываю езешник открывается командная строка и сразу тухнет :(. Как...

Первая программа
Ток начал работать в RadASM и компилятор у меня masm32. Вот первая прога как в книге Калашникова которая не запустилась(( CSEG...

первая программа : )
Скопипастил из книжки, что то не работает = \ .386 .model flat,stdcall .code start: mov eax,2 add eax,3 ret

55
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 08:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dimedrol Посмотреть сообщение
Теперь ничего не выводит
хм.. странно. У меня все в порядке - пишет 14... (Ubuntu 9.10 Karmic Koala(знаю, староват), nasm-2.09.02 )
Еще раз код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
global main
extern printf
 
section .text
main:
mov     ax,     8
mov     cx,     6       
mov     dx,     cx      
add     dx,     ax
 
mov eax, edx
push eax
push dword fmt
call printf
add esp,8
 
; sys_exit - для корректного завершения
xor ebx, ebx
mov eax, 1
int 0x80
 
ret
 
section .data
fmt : db "%d", 0xa, 0
и компиляция:
$ nasm -felf new.asm
$ gcc -o new new.o
$ ./new
14
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 10:34  [ТС]
Теперь работает. Спасибо! Я, наверное, не там и не то заменил на main
А почему, когда я пишу вместо
Assembler
1
2
3
4
mov     ax,     8
mov     cx,     6       
mov     dx,     cx      
add     dx,     ax
вот это:
Assembler
1
2
3
4
mov     ax,     8
mov     cx,     6       
mov     dx,     cx      
sub     dx,     ax
мне выводит 65534?
Вроде, должно 2 вывести.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 11:18
от 6 отнимает 8 получается -2. В беззнаковом 65534

Добавлено через 9 минут
это потому что используются 16 разрядные регистры. Если изменить на
Assembler
1
2
3
4
mov     eax,     8
mov     ecx,     6       
mov     edx,     ecx      
sub     edx,     eax
все в порядке - выводит -2

Добавлено через 19 минут
если надо именно 16 разрядные (тип short) то вывод
fmt : db "%hd", 0xa, 0
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 11:18  [ТС]
Еще будет вопрос:
Зачем мы копируем из ecx в edx (вопрос, как я понимаю, очень глупый )?
Я об этой строчке:
Assembler
1
mov     edx,     ecx
Если я напишу так:
Assembler
1
2
3
4
mov     eax,     6
mov     ecx,     6   
;mov     edx,     ecx    ; ecx заменяем на  edx
sub     ecx,     eax
будет ошибка?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 11:23
Цитата Сообщение от Dimedrol Посмотреть сообщение
Зачем мы копируем из ecx в edx
эта строчка конечно абсолютно бессмыслена. Просто так было в вашем первоначальном коде и я не стал менять
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 11:41  [ТС]
Поставил задачу:
(8 - 2) / 2
Вывести должно 3

А как в "переменную" засунуть результат от 8-2 ?

Вот что есть на данный момент:
Assembler
1
2
3
4
mov     eax,    2
mov     ecx,    8   
mov     edx,    3
sub     ecx,     eax ; ecx - eax
Получается так:
(ecx - eax) / edx


sub ecx, eax ; надо занести в переменную
Assembler
1
2
3
4
5
mov     eax,    2
mov     ecx,    8   
mov     edx,    3
sub     ecx,     eax ; занести в переменную
div     переменная, edx
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.10.2010, 12:02
Нужно помнить, что при операции div и idiv делится регистровая пара EDX:EAX на операнд, а не просто EAX. Т.е. если вы не желаете делить 64разрядное число, то нужно расширить eax командой cwd(знаковое расширение) или xor edx,edx(беззнаковое)

Assembler
1
2
3
4
5
6
;(8 - 2) / 2
mov eax,8
sub eax,2
mov ebx,2
xor edx,edx
div ebx
Либо пооптимальней вариант
Assembler
1
2
3
mov eax,8
sub eax,2
shr eax,1 ; деление сдвигом
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 12:16
если нужна именно переменная то на nasm это так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
global main
extern printf
 
section .text
main:
mov   eax,  8
mov  ecx,   2
mov  ebx,   2
sub   eax, ecx
xor   edx,  edx
mov dword [divisor], ebx
div dword [divisor]
 
push eax
push dword fmt
call printf
add esp,8
 
; sys_exit - для корректного завершения
xor ebx, ebx
mov eax, 1
int 0x80
 
ret
 
section .data
fmt : db "%d", 0xa, 0
 
section .bss
divisor resd 1
а вообще правильнее как уже сказано выше

Добавлено через 1 минуту
Цитата Сообщение от Goodwin98 Посмотреть сообщение
командой cwd
cdq наверно
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 12:40  [ТС]
Либо пооптимальней вариант
Assembler
1
2
3
mov eax,8
sub eax,2
shr eax,1 ; деление сдвигом
У нас в eax будет конечный результат или результат от вычитания?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.10.2010, 12:52
Цитата Сообщение от vital792 Посмотреть сообщение
cdq наверно
Да, конечно cdq

Цитата Сообщение от Dimedrol Посмотреть сообщение
У нас в eax будет конечный результат или результат от вычитания?
Конечный, т.е. после деления.
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 13:02  [ТС]
Так, извиняюсь за глупые вопросы, а можно записать результат от вычитания, к примеру, в ebx?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.10.2010, 13:09
Можно. А зачем ?
0
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 13:18  [ТС]
Goodwin98, Мне так легче понять. Потом уже буду переходить на более сложные преобразования...
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.10.2010, 13:23
Может быть я тогда не совсем понял, что имелось ввиду, но после
Assembler
1
2
3
mov ebx,8
sub ebx,2
shr ebx,1 ; деление сдвигом
результат будет в ebx.
При выводе, ф-ции printf в этом случае нужно передавать содержимое ebx.
1
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 13:45  [ТС]
Я не совсем об этом.
Я хочу, чтобы было поэтапно:
Assembler
1
2
3
mov     eax,     8
mov     ecx,     2 
mov     edx,     2
1. От eax отнимаем ecx и помещаем результат ,к примеру, в eah.
2. eah делим на edx

Добавлено через 14 минут
Стойте...
Так если я пишу:
Assembler
1
2
3
mov     eax,     8
mov     ecx,     2
add     eax,     ecx
в eax будет число 10?????
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 14:01
Цитата Сообщение от Dimedrol Посмотреть сообщение
в eax будет число 10?????
да
add приемник, источник

Добавлено через 50 секунд
результат по сишному eax += ecx
0
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 14:01  [ТС]
А почему у меня единицу выводит ?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 14:05
Я честно говоря считаю что начинать изучение asm лучше в винде или в досе, в никсах не найти нормального отладчика( к сожалению gdb не поможет)

Добавлено через 1 минуту
Цитата Сообщение от Dimedrol Посмотреть сообщение
А почему у меня единицу выводит
не может быть. А можно весь код?

Добавлено через 16 секунд
Цитата Сообщение от Dimedrol Посмотреть сообщение
А почему у меня единицу выводит
не может быть. А можно весь код?
0
 Аватар для Dimedrol
2378 / 941 / 129
Регистрация: 25.04.2009
Сообщений: 2,635
Записей в блоге: 4
10.10.2010, 14:07  [ТС]
Еще вопросик:
После прочтения книги оказалось, что ASM может считать и в двоичной системе... А как переключиться на нее?
И второй вопросик:
чем отличается eax от ax?

Добавлено через 22 секунды
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
global main
extern printf
section .text
main:
;Сама программа
 
mov     eax,     8
mov     ecx,     2
add     eax,     ecx
 
 
;end Сама программа
mov eax,    edx
push    eax
push    dword   fmt
call    printf
add esp,    8
xor ebx,    ebx
mov eax,    1
int 0x80
ret
section .data
fmt : db "%d", 0xa, 0
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
10.10.2010, 14:14
Цитата Сообщение от Dimedrol Посмотреть сообщение
;end Сама программа
mov eax, edx
он выводит содержимое edx


Цитата Сообщение от Dimedrol Посмотреть сообщение
двоичной системе... А как переключиться на нее?
101001b или 0b101001 - в nasm можно и так вроде
Цитата Сообщение от Dimedrol Посмотреть сообщение
чем отличается eax от ax?
eax 32 разрядный регистр ax его младшая половина (16 разрядн)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2010, 14:14

Первая программа asm
Надо написать калькулятор, работающий со стеком. Реакции на нажатия на клаве: 1. Ввели число 0..9, необходимо пометстить его на вершину...

Первая программа на gnu asm
Жалко, простаивает раздельчик, а тема то очень интересная. Может кто присоединится? Написала игру пока без использования стека,...

Первая программа
Решил выучить основы ассемблера. Скачал себе TASM. Сразу прочитал пару статей об первой праграмме на ТАСМ. Но я всеравно непонял как...

Первая программа на ассемблере
Здравствуйте! Мне очень нужна ваша помощь . В вузе начали только изучать ассемблер , никто ничего не объясняет. Очень хочу разобраться в...

Первая программа на Tasm
MODEL TINY STACK 256 DATASEG Hellostr DB 'Hello First Step Site ' CODESEG start: mov ax,@data mov ds,ax mov...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru