Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 233
от 08.09.2005, 22:24

Администратор:Калашников О.А.
В рассылке:Подписчиков: 256, Экспертов: 19
В номере:Вопросов: 6, Ответов: 17


Вопрос № 25728: Здравствуйте. Создал я значит файл с этим кодом (смотрите приложение), файл назвал proga.asm расположил его на диске C. Запустил командную строку, и пишу: C:MASM32BINml.exe C:prog.asm /AT и выходит сообщение: "constant value too large&q...
Вопрос № 25742: Question: Есть идея, незнаю может и глупая, т.к. я могу чего-нибудь и неучесть! Допустим нужно поместить в ОЗУ число 123, один символ - один байт. При вводе с клавиатуры нужно реализовать алгоритм, который принимает каждую цифру ...
Вопрос № 25745: Question: Может ли программа ассемблера принимать параметры командной строки через слеш? например: mem /c...
Вопрос № 25749: Question: Два вопрося если можно. 1. Что делает уоманда movzx 2. Я часто замечал, что в исходных текстах программисты употребляют войной AT(@) например: @@loop или @@start: Что это дает? и еще что за команда, которую я не нашел в ...
Вопрос № 25750: Question: Пробую вопрос задать правильно. Мне нужно, чтобы программа, написанная языком ассемблера, принимала параметры командной строки, т.е. если пользователь ввел имя скомпилированного файла программы написанн...
Вопрос № 25771: Я пробовал написать программу (самую первую в пособии) на asm , но он выдает постоянно ошибки при линковании . Скажите ,пожалуйста, вообще приемлимо ли писать данные программы на asm или нужен обязательно masm. Если только на masm то не могли бы...

Вопрос № 25.728
Здравствуйте.
Создал я значит файл с этим кодом (смотрите приложение), файл назвал proga.asm расположил его на диске C. Запустил командную строку, и пишу: C:MASM32BINml.exe C:prog.asm /AT и выходит сообщение: "constant value too large". Пишу я: C:MASM32BINml.exe C:MyProgsproga.asm /AT /link и C:MASM32BINml.exe C:MyProgsproga.asm /AT /link но всёравно выходит сообщение: "constant value too large". Что делать?
Отправлен: 03.09.2005, 01:10
Вопрос задал: Дмитрий Хаймин (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Стас
Здравствуйте, Дмитрий Хаймин!
Приложить текст... :)
Ответ отправил: Стас (статус: Практикант)
Отправлен: 03.09.2005, 01:31

Отвечает: ASMодей
Здравствуйте, Дмитрий Хаймин!
У тебя ошибка в тексте твоей программы. Поскольку текста программы нет, сказать что за ошибка нельзя, но компилятор помимо ошибки выдает еще и номер строки программы на котором произошла ошибка. Вот в этой строке ее и ищи.
Ответ отправил: ASMодей (статус: Профессионал)
Отправлен: 03.09.2005, 08:10

Отвечает: newinfo2005
Здравствуйте, Дмитрий Хаймин!
А где приложение?
Давай ищи ошибку в тексте
или давай текст проги!!!
---------
Хочу стать умным и...много денег и халявного инета.
Ответ отправил: newinfo2005 (статус: 5-ый класс)
Отправлен: 03.09.2005, 10:53

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Дмитрий Хаймин!

Сообщение: "constant value too large" чаще всего бывает, когда резервируется
память по DB, DW и т.д. и инициализируется значением, которое туда просто не влазит :)
Например, bValue db 1000 ; 1000 явно больше 255 :)
Если не это, то точно без текста не обойтись.
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 03.09.2005, 13:45


Вопрос № 25.742
Question:

Есть идея, незнаю может и глупая, т.к. я могу чего-нибудь и неучесть!
Допустим нужно поместить в ОЗУ число 123, один символ - один байт.
При вводе с клавиатуры нужно реализовать алгоритм, который принимает каждую цифру

отдельно, т.е. не 123, а 1, 2, 3 из каждого числа вычитает 48dec, или 30h и

помещает их в память по отдельности!
Пусть пользователь ввел число 456789, его нужно поместить в ОЗУ.
Что делает алгоритм:
считывает 4 вычитает 48 помещает в ОЗУ,
считывает 5 вычитает 48 помещает в ОЗУ, и т.д.

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

программа должна преобразовать ее соответствующим образом и поместиь и вывести

запрос на ввод следующей цифры и как только пользовател нажмет Enter поместить

адрес числа в переменную или регистр процессора!
Т.е. пользователь даже не знает что вводя длинную цифру, программа обрабатывает каждую по отдельности.

Можно ли такое реализовать?
Отправлен: 03.09.2005, 10:47
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 15)

Отвечает: Вiктор
Здравствуйте, Терсков Алексей Николаевич!
лично я такое не делал, но это можно сделать.
какие у вас возникли трудности?
для начала определитесь как должна работать функция, потом создайте алгоритм работы, потом реализуйте алгоритм на языке программирования.
будут вопросы - спрашивайте.

кстати, я думаю что фунции ввода ЯВУ как раз так и работают, например readln() из паскаля.

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

удачи!
---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 03.09.2005, 14:16
Оценка за ответ: 5
Комментарий оценки:
Дело в том, что я думал у кого-то уже есть готовый алгоритм!
Ведь таким образом можно записывать очень длинные цифры в память!
Ведь так!
И не нужно ломать голову и делать всякие супер-дупер процедуры!

Отвечает: Sager
Здравствуйте, Терсков Алексей Николаевич!
Попробуй функцию 0Ah int 21h, более подробно все это описывается у Абеля, Глава 9
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 03.09.2005, 15:34
Оценка за ответ: 5
Комментарий оценки:
Теперь стало еще проще, записать строку в буфер, а далее уже обрабатывать!
Обязательно посмотрю Абеля!


Вопрос № 25.745
Question:

Может ли программа ассемблера принимать параметры командной строки через слеш?
например: mem /c
Отправлен: 03.09.2005, 11:25
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
Параметры командной строки передаются запустившейся программе. Так что хоть слеши, хоть что угоднО!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 03.09.2005, 11:28
Оценка за ответ: 5
Комментарий оценки:
Это я знаю.

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Терсков Алексей Николаевич!

Осталось только добавить, что в ДОС-е командная строка лежит по адресу DS:80h
А в Винде юзай GetCommandLine
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 03.09.2005, 14:37
Оценка за ответ: 5
Комментарий оценки:
Как я понимаю, то с ней и нужно выполнять сравнение! :-)
Попробую!


Вопрос № 25.749
Question:
Два вопрося если можно.
1. Что делает уоманда movzx
2. Я часто замечал, что в исходных текстах программисты употребляют войной AT(@)
например: @@loop или @@start: Что это дает?
и еще что за команда, которую я не нашел в справочнике pusha popa,
зачем сдесь окончание a?, чем эти команды отличаются от push pop.
Отправлен: 03.09.2005, 12:30
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sager
Здравствуйте, Терсков Алексей Николаевич!
1) она обнуляет регистр и помещает в него то, что указал, например:
movzx ebx,ax
тоже самое, что и это:
xor ebx,ebx
mov ebx,ax
2) если не ошибаюсь, то @@ что-то типа локальной метки, например, в турбо-паскале(независимо от того на паскале ты пишешь или делаешь асм вставки) нужно все метки объявлять в секции label, а если будешь писать @@ перед меткой, то затем объявлять не нужно будет.
pusha - push all, popa - pop all
pusha размещает в стеке регистры общего назначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di, а popa их соответственно "выталкивает".
push кладет в стек только то, что ты ему укажешь и кладет он только по одному региструзначениюпеременнойetc
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 03.09.2005, 15:16
Оценка за ответ: 5
Комментарий оценки:
pusha - хорошая команда! :-)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Терсков Алексей Николаевич!

Э-э-э, справочник. наверное, по 8086/8088? Надо бы по 386 :)
1. MOVZX служит для засылки байта либо слова в слово либо двойное слово с заполнением старших бит нулями. Например:
MOVZX EAX, CL ; Если CL = 0fah, то в результате будет EAX = 000000FAh
MOVZX AX, CL ; Если CL = 0fah, то в результате будет AX = 00FAh
MOVZX EAX, CX ; Если CX = 0fffah, то в результате будет EAX = 0000FFFAh
Попутно замечу, что есть еще команда MOVSX, которая осуществляет знаковое расширение, т.е. старший бит числа расширяется на старшие байты, например:
MOVSX EAX, CL ; Если CL = 0fah, то в результате будет EAX = 0FFFFFFFAh

2. Таким образом указывается ассемблеру, что данные метки являются локальными, т.е. действуют только внутри конктретной подпрограммы. Тогда внутри другой подпрограммы можно использовать те же метки, и конфликта не будет!
Замечу только, чтобы это работало, надо в самом начале дать директиву ассемблеру LOCALS

3. PUSHA и POPA отличаются от PUSH и POP тем, что PUSH и POP оперируют с одним операндом, а PUSHA и POPA кидают в стек и извлекают из него все регистры разом в такой последовательности: AX, CX, DX, BX, SP, BP, SI, DI.
Опять же попутно замечу, что команды PUSHAD и POPAD работают с 32-битными регистрами EAX, ECX, EDX, EBX, ESB, EBP, ESI, EDI

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 2-ой класс)
Отправлен: 03.09.2005, 15:23
Оценка за ответ: 5
Комментарий оценки:
Мне бы энциклопедию по ассемблеру! :-)

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
1. записывает в регистр большей разрядности число из регистра или памяти меньшей разрядности и расширяет его верхние разряды нулями.

2. Это временные переменные. то есть, они не будут пересекаться с другими переменными в блоках и подпрограммах.

pusha - сохранить много регистров.

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

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 03.09.2005, 15:59
Оценка за ответ: 5
Комментарий оценки:
Длинная история! :-)
Я потерял ваш справочник!
У меня HARD навернулся, когда Linux устанавливал.
После создания раздела Linux-ом Partition Magic заругался, что типа жесткий навернут! и пошло поехало... Крах.... :-)


Вопрос № 25.750
Question:

Пробую вопрос задать правильно.

Мне нужно, чтобы программа, написанная языком ассемблера, принимала параметры

командной строки, т.е. если пользователь ввел имя скомпилированного файла

программы написанной на ассемблере и после ее имени в консоли поставил параметр

/p1, то вызовется процедура proc1 и программа завершается, если /p2, то вызовется

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

Запятые везде поставил? ;-)
Отправлен: 03.09.2005, 12:45
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Вiктор
Здравствуйте, Терсков Алексей Николаевич!
командная строка - это строка, и работают с ней как с обычной строкой.
т.е. вам нужно искать в командной строке "/р1". Если нашли, то вызывать соответствующую процедуру. Если не нашли, то искать ещё что-нибудь, например "/р2", или ещё какой-нибудь нужный вам параметр.
итак, вам надо искать в строке (командной строке) совпадение с другой строкой (вашим параметром, например "/р1"). И в зависимости от того нашли или нет - вызывать или нет вашу процедуру. И так для каждого параметра, который собирается понимать ваша программа.
Вот так, всё ручками. Надеюсь понятно.
удачи!
---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 03.09.2005, 14:48
Оценка за ответ: 5
Комментарий оценки:
Конечно понятно, а я совсем по другому думал!,
а оказывается нужно просто лезть по строке и сравнивать!
т.е. допустим p1 - два байта, значит сканируем по два байта в командной строке!, а слеш, я думаю лучше указать!

Отвечает: Sager
Здравствуйте, Терсков Алексей Николаевич!
Ничего не нужно делать, чтобы программа принимала параметры, она их принимает по умолчанию. Тебе просто нужно их считать по адресу начиная с CS:0080h. Сначало идет длина командной строки, затем пробел, а потом твои параметры, можешь сделать так:
mov ax,"p1" ;слэш можно и не проверять, ну а если всё-таки так надо, то ;можешь написать так mov ax,"/p", а в конце после repne проверить 1 или 2
push cs
pop es
mov di,80h
mov cx,60h
repne scasw
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 03.09.2005, 16:21
Оценка за ответ: 5

Отвечает: newinfo2005
Здравствуйте, Терсков Алексей Николаевич!
Все очень просто.
По смещению где находится параметр ,который ввел пользователь,обрабатываешь.
Если /p1 то вызываешь процедуру которая соответсвует например сравниваешь
этот параметр если он есть вызываешь определенную процедуру.
Ничего сложного нету-у калашникова это рассказывается очень доходчиво.
Удачи!!

---------
Хочу стать умным и...много денег и халявного инета.
Ответ отправил: newinfo2005 (статус: 5-ый класс)
Отправлен: 03.09.2005, 16:25
Оценка за ответ: 5


Вопрос № 25.771
Я пробовал написать программу (самую первую в пособии) на asm , но он выдает постоянно ошибки при линковании . Скажите ,пожалуйста,
вообще приемлимо ли писать данные программы на asm или нужен обязательно masm. Если только на masm то не могли бы вы объяснить, как именно его запустить(у меня не получатся ни с windows, ни с dos(может я что то не так делаю?))
Отправлен: 03.09.2005, 19:46
Вопрос задал: Qwe (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: newinfo2005
Здравствуйте, Qwe!
Простите какую прогу,какие ошибки и на каком асме?
Можно писать на ТАсм и на масм и на других подобных даже в откладчиках некоторых.
Если ты на тасме делаешь сом-прогу,то надо сделать:
Пример:
cseg segment
assume cs:cseg,ss:cseg,es:cseg,ds:cseg;это надо делать у тасмов,привязка сегм.
org 100h
begin:
mov ah,09
mov dx,offset text
int 21h
int 20h
text db "Hello,world!!!"
cseg ends
end begin
Компоновка:
c: asmin asm.exe c:1.asm
c: asmin link.exe c:1.obj /t
Под масм тоже самое только компилить:
C:masminMl.exe c:1.asm /AT
Оболочки могут не работать!!!
Удачи.
З.Ы.
Надо задавать вопросы так чтобы было всем понятно.
Пиши что выдает,пишишь,что используешь,где и т.д.
---------
Хочу стать умным и...много денег и халявного инета.
Ответ отправил: newinfo2005 (статус: 5-ый класс)
Отправлен: 03.09.2005, 20:04

Отвечает: Вiктор
Здравствуйте, Qwe!
вы далеко не первый, у кого такие проблемы.
Я так понял вы используете пособие "Ассемблер - это просто. Учимся программировать" Калашникова О. А. ?
В нём есть указания как следует ассемблировать программы, как запускать МАСМ.
У этой рассылки есть архив, в нём уже есть ответы на подобные вопросы. Вы искли в архиве? если нет, то советую поискать.
насчёт МАСМ: в пособии как раз и указывалось, что данные программы можно делать на МАСМ, а ещё на ТАСМ (хотя точно не помню, может быть для ТАСМа нужна небольшая переделка). вероятно также что их можно делать и на FASM и других ассемблерах.
ваша проблема - ошибки при линковании. Причины этого могут быть разные, и решения тоже разные. Так как вы не указали ничего про то, что это за ошибка, когда она возникает, то ответить вам нет возможности.
пожалуйста, просмотрите внимательно пособие, может быть там есть решение вашей проблемы. Просмотрите также архив рассылки, там тоже может быть решение подобного случая. Прочитайте ещё какой-нибудь учебник по асм-у (елси они у вас есть), может быть вы поймёте в чём ошибка. Можете также поискать ответ в интернет-поисковиках.
Если же у вас ничего не выйдет, то задайте вопрос повторно, причем укажите какую именно программу вы делаете (пришлите исходный текст во вложении вопроса), укажите как вы производите ассемблирование и линковку (какие параметры передаёте ассемблеру и линковщику), какие версии ассемблера и линковщика вы используете, какую именно ошибку выдаёт линковщик.
(ведь доктору вы говорите не "я заболел" а "у меня болит нога, левая, в коленке. Начала болеть вчера", чтобы доктор скорее вас вылечил)
и ещё: будьте внимательны и вдумчивы. Мы можем помочь вам, но не сможем учиться за вас.
удачи!
---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 03.09.2005, 20:35
Оценка за ответ: 5

Отвечает: Sager
Здравствуйте, Qwe!
masm(конкретнее ml.exe, ну и link.exe тоже) - это консольная программа, поэтому-то ее надо запускать в командной строке, передавая ей параметры. А если ты просто запустишь ее, кликнув два раза мышью, то она запуститься, выплюнет тебе инфу о себе и закроется, т.к. она не получила никаких параметров. Чтобы открыть командную строку делай следующее: Пуск-Выполнить- пишешь cmd и жмешь enter, либо заходишь в стандартные-командная строка.
Используй масм, забудь про тасм. И самое главное не забывай правильно указывать путь, где у тебя лежит masm и твоя прога, а то напишешь так:
ml.exe prog.asm /AT
и могут появиться ошибки, если ты конечно в переменной path не пропишешь каталог где находится масм с прогой,а вообще лучше создать бат-файл:

asm.bat:

set name=путь_к_исходникуимя_исходника_без_расширения

путь_к_масмуinml.exe %name%.asm /AT
del %name%.obj
pause
Ответ отправил: Sager (статус: 6-ой класс)
Отправлен: 04.09.2005, 07:58


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное