Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2011, 18:58   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию первая программа в MASM32

Читаю книжку Олега Калашникова. В принципе автор все хорошо объясняет, за исключением того, как скомпилировать ехе-файл!!!!
Я скачал MASM32. Был создан MASM32 Editor. Захожу в него, пишу код
Код:
CSEG segment
org 100h

Begin:

	mov ah,9
	mov dx,offset Message
	int 21h

	int 20h

Message db 'Hello, world!$'

CSEG ends
end Begin
сохраняю значит код. вообще этот Editor не позволяет сохранять *.asm файлы!!! только файлы без расширения!
Ну сохраняю я файл под названием ww
Далее жму Project/ASSEMBLE ASM File
Открывается окошко, в котором написано

Код:
Assembling: C:\Users\Dimarik\Desktop\ww.asm
MASM : fatal error A1000: cannot open file : C:\Users\Dimarik\Desktop\ww.asm
 ’®¬ ў гбва®©б⢥ C *Ґ Ё¬ҐҐв ¬ҐвЄЁ.
 ‘ҐаЁ©*л© *®¬Ґа ⮬*: 9687-ECC1

 ‘®¤Ґа¦Ё¬®Ґ Ї*ЇЄЁ C:\Users\Dimarik\Desktop

09.02.2011  18:51               146 ww
               1 д*©«®ў            146 Ў*©в
               0 Ї*Ї®Є  70я591я680я512 Ў*©в бў®Ў®¤*®
Это проблемы с кодировкой или так и должно быть?
В хэндле окна написано \masm32\bin\asmbl.txt
и еще командная строка открылась.
Иду дальше. Жму Project/Link OBJ File
открылось окошко с хэндлом \masm32\bin\link.txt
Код:
 ’®¬ ў гбва®©б⢥ C *Ґ Ё¬ҐҐв ¬ҐвЄЁ.
 ‘ҐаЁ©*л© *®¬Ґа ⮬*: 9687-ECC1

 ‘®¤Ґа¦Ё¬®Ґ Ї*ЇЄЁ C:\Users\Dimarik\Desktop

09.02.2011  18:51               146 ww
               1 д*©«®ў            146 Ў*©в
               0 Ї*Ї®Є  70я591я680я512 Ў*©в бў®Ў®¤*®
...опять проблема с кодировой что ли?
Но вот в этот раз в открывшемся cmd написано:
LINK: fatal error LINK1181: cannot open imput file "C:\Users\Dimarik\Desctop\ww.ob j"


Кто может, объясните, пожалуйста, как надо правильно создавать в этой программе exe файлы и что я вообще делаю не так? После языков высокого уровня ооооочень трудно assembler учить......
Dimarik вне форума Ответить с цитированием
Старый 09.02.2011, 21:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Я скачал MASM32. Был создан MASM32 Editor.
Вообще-то это два разных пакета. В масм32 редактор обычно qedit.
p51x вне форума Ответить с цитированием
Старый 09.02.2011, 21:33   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

qeditor.exe
Именно он.
Так что я неправильно делаю? Поясните кто что знает, пожалуйста.
Dimarik вне форума Ответить с цитированием
Старый 10.02.2011, 00:19   #4
gefest58
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 87
По умолчанию

може , int 20h , после вывода строки поставить ?
мы все врём , скомпилированный исходник - нет !
gefest58 вне форума Ответить с цитированием
Старый 10.02.2011, 10:30   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Dimarik
ml.exe из пакета masm32 не создает COM-файлов, тебе нужен ml версии 6.14 и линкер к нему не старше 6 версии, в сети найдешь
Mikl___ вне форума Ответить с цитированием
Старый 10.02.2011, 20:19   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

разбираю пример из книги .....
Код:
CSEG segment
org 100h

Begin:

	mov ah,9; загружаем в регистр ah число 9
	mov dx,offset Message; загружаем в регистр dx адрес сообщения для вывода
	int 21h

	int 20h; в результате этого прерывания программа возвращается туда откуда её вызывали (загружали)
	; это что-то вроде функции выхода в языках высокого уровня

Message db 'Hello, world!$'

CSEG ends
end Begin
Подскажите плиз, почему мы именно в регистр ax загружаем 9, а не другое число?
dx - это ссылка на функцию Message, так?
Но где мы именно выводим эту ссылку на экран?
Dimarik вне форума Ответить с цитированием
Старый 11.02.2011, 08:37   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Подскажите плиз, почему мы именно в регистр ax загружаем 9, а не другое число?
Такое соглашение для прерывания.

Цитата:
dx - это ссылка на функцию Message, так?
А слаюо глаза ниже по коду опустить и увидеть, что вы несете бред! Это явно никакая не функция.

Цитата:
Но где мы именно выводим эту ссылку на экран?
Забыв про ссылку, выводит 6 функция 21-го прерывания.
p51x вне форума Ответить с цитированием
Старый 11.02.2011, 10:25   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

9h это номер функции, для того чтобы обработчик прерывания знал на какой адрес передать управление в зависимости от этого номера, в dx - аргумент данной функции(адрес строки в данном случае)
получив прерывание int 21, процессор смотрит таблицу IDT куда передать управление для обработки данного прерывания, передает управление, далее анализируется ah, чтобы понять куда передать управление далее, передается управление на функу вывода информации в адреса отведенные под видеопамять, информация же берется начиная с адреса в dx, или же вообще сразу передается управление сервисам биос, я не в курсе ибо AC/DC про трассировку интов ничего не пели
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 12.02.2011, 18:00   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

пока что только начинаю изучать ассемблер... непонятны несколько вещей:
1. В регистрах записывается информация. То есть они как бы - переменные в языках высокого уровня. То есть при написании программ на asm у нас ограниченное число перменных?
2.
mov ah,9; загружаем в регистр ah число 9
mov dx,offset Message; загружаем в регистр dx адрес сообщения для вывода
вот мы выводим сообщение на экран. Со второй строкой всё понятно. А что делает первая строка? Почему мы именно 9 загружаем и именно в регистр ah
И вывод сообщения заканчивается вызовом прерывания 21h. Оно что делает? Завершает вывод информации на экран?
или просто функция Message db 'Hello, world!$'
пользуется значением регистра ahи в зависимости от этого значения по-разному выполняется?
3. Аналогично, если не трудно, подобно первому вопросу, объясните пожалуйста, что построчно делают эти строки
mov ah, 10h;????
int 16h

P.S. мой второй и третий вопрос свидетельствует что у меня конкретный пробел в фундаментальных знаниях ассемблера. Только я не совсем понимаю что мне надо прочитать чтоб его ликвидировать. Где понятно написано про то, какими функциями прерывания пользуются, каждая за что отвечает и какими регистрами пользуются функции?
Dimarik вне форума Ответить с цитированием
Старый 12.02.2011, 18:25   #10
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
пока что только начинаю изучать ассемблер... непонятны несколько вещей:
1. В регистрах записывается информация. То есть они как бы - переменные в языках высокого уровня. То есть при написании программ на asm у нас ограниченное число перменных?
Можно и так сказать. С другой стороны никто не мешает использовать память, что-бы там хранить хоть стопицот переменных.
Цитата:
Сообщение от Dimarik Посмотреть сообщение
2.
mov ah,9; загружаем в регистр ah число 9
mov dx,offset Message; загружаем в регистр dx адрес сообщения для вывода
вот мы выводим сообщение на экран. Со второй строкой всё понятно. А что делает первая строка? Почему мы именно 9 загружаем и именно в регистр ah
И вывод сообщения заканчивается вызовом прерывания 21h. Оно что делает? Завершает вывод информации на экран?
или просто функция Message db 'Hello, world!$'
пользуется значением регистра ahи в зависимости от этого значения по-разному выполняется?
Прерывания - это по типу таких подпрограмм или если угодно процедур. На вход такой процедуры мы должны подать значение, в зависимости от которого будет выполнено то или иное действие. Вот прерывание int 21h - это прерывание системы MS-DOS, которое позволяет делать много чего. Например открыть файл, выделить кусок памяти, закрыть файл, считать строку с клавиатуры, и прочее и прочее. В документах (стандартах) описано, что если в AX будет занесена функция 09 - это означает "вывести строку на экран". При этом в DX должно быть смещение, по которому расположена строка в памяти. Далее идет сам вызов - int 21h
Цитата:
Сообщение от Dimarik Посмотреть сообщение
3. Аналогично, если не трудно, подобно первому вопросу, объясните пожалуйста, что построчно делают эти строки
mov ah, 10h;????
int 16h

P.S. мой второй и третий вопрос свидетельствует что у меня конкретный пробел в фундаментальных знаниях ассемблера. Только я не совсем понимаю что мне надо прочитать чтоб его ликвидировать. Где понятно написано про то, какими функциями прерывания пользуются, каждая за что отвечает и какими регистрами пользуются функции?
Ну самый пожалуй известный сборник прерываний и их функций - это Ralf Brown's Interrupt List ( http://www.ctyme.com/rbrown.htm ) , хотя есть и многие другие, например старенькая программка Tech Help ( http://old-dos.ru/files/file_1067.html ).
Изходя из этого по поводу третьего вопроса - идем на вышеназванный ральф браун лист, выбираем номер прерывания - 16h: http://www.ctyme.com/intr/int-16.htm Находим функцию AH=10h: http://www.ctyme.com/intr/rb-1771.htm и читаем описание. Если кратко - это функция чтения одного символа (его скан кода) с клавиатуры. После выполнения команды int 16 в регистре AL вернется ASCII символ, а в регистре AH его скан код/.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Первая программа на Java JokerWCC Помощь студентам 4 28.11.2010 17:08
Первая программа... ViJey Помощь студентам 6 27.09.2010 20:49
Моя первая программа. fragment Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 11.05.2010 11:46
Первая программа на WINAPI Syltan Win Api 8 27.02.2010 22:38
Первая программа, C++ Bulder edmynt Помощь студентам 2 31.01.2010 15:12