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

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


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

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

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

Выпуск № 228
от 03.09.2005, 21:23

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


Вопрос № 25474: CSEG segment ; начало общего сегмента assume cs:CSEG, ds:CSEG, ss:CSEG ;привязка к сегментам и их имена org 100h ;отступаем BEGIN: ; записываем адреса строк в массив MOV strs[0*2],offset str1 MOV strs[1*2],offset str2<...
Вопрос № 25480: 57. Закодировать команды для умножени (MUL). а)слова DATAX на слово DATAY; б)двойного слова, начинающегося ео адресу DATAX, на слово DATAY. ----------------------------------------------------------- DATAX DW 0148H DW 2316H<...
Вопрос № 25488: Вопрос: Как я вас понимаю, то я должен дойное слово разложить на старшее слово - H, и младщее - L, т.е. 01482316h - H = 0148, L = 2316h, а что делать 0237h? вы имеете в виду, что я должен разложить его так: H-02h, L-37h? Вот, что получается:<...
Вопрос № 25508: Здравствуйте уважаемые эксперты! 1. Нет ли у кого-нибудь библиотек(*.lib) кодирования или декодирования музыки, видео или вообще чего-нибудь? 2. Возможно ли под Visual C++ 6.0 создать lib файл, что бы он был совместим с MASM32, если да тока (...

Вопрос № 25.474
CSEG segment ; начало общего сегмента
assume cs:CSEG, ds:CSEG, ss:CSEG ;привязка к сегментам и их имена
org 100h ;отступаем

BEGIN:
; записываем адреса строк в массив
MOV strs[0*2],offset str1
MOV strs[1*2],offset str2
MOV strs[2*2],offset str3
MOV strs[3*2],offset str4
MOV strs[4*2],offset str5
MOV strs[5*2],offset str6
MOV strs[6*2],offset str7
;массив содержит 6*2+2 байт адресов

MOV AH,09h ; вывести строку
LEA DX, message
INT 21h

MOV AH,08h ; ввести символ без дублирования
INT 21h

SUB AL,30h
MOV str_,AL ; т.к. мне требуется менее девяти символов, то можно просто

вычесть 48

; тепреь в зависимости от введенного пользователем числа 0-7, нужно

вывести соответсвующую строку символов
MOV AH, 09h
MOV DX, ?; вот, что мне нужно!, я забыл, как правильно получить адрес

строчки?
INT 21h

INT 20h ; выход из программы
str_ db ?
strs dw 7 dup (?)
; строки по 14 символов
str1 db 'воскресенье',0Ah,0Dh,'$'
str2 db 'понедельник',0Ah,0Dh,'$'
str3 db 'вторник....',0Ah,0Dh,'$'
str4 db 'среда......',0Ah,0Dh,'$'
str5 db 'четверг....',0Ah,0Dh,'$'
str6 db 'пятница....',0Ah,0Dh,'$'
str7 db 'суббота....',0Ah,0Dh,'$'

message db 'введите номер дня недели',0Ah,0Dh,'$'

CSEG ends ;завершить сегмент
end BEGIN ;завершить метку
Отправлен: 29.08.2005, 09:48
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
MOVZX BX, [str_]
SHL BX, 1
mov dx, [strs + BX]

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 29.08.2005, 09:57


Вопрос № 25.480
57. Закодировать команды для умножени (MUL).
а)слова DATAX на слово DATAY;
б)двойного слова, начинающегося ео адресу DATAX, на слово DATAY.

-----------------------------------------------------------
DATAX DW 0148H
DW 2316H
DATAY DW 0237H
DW 4052H
1. MOV AX,DATAX
MUL DATAY
Результат в DX и AX
2. А вот сздесь я встрял! Странное конечно проеделение переменных, но как я понимаю, то слово 2316h хранится сразу после слова 0148h.
Теперь следует поределить переменную DD и поместить туда все содержимое DATAX, и умножить это дело на 0237h.
Как умножить двойное слово в реальном режиме?
Ведь в реальном режиме нет регистра EAX!
-----------------------------------------------------------
Отправлен: 29.08.2005, 10:37
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

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

так что умножай - всё будет путём
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 29.08.2005, 11:09

Отвечает: Bob Johnson
Здравствуйте, Терсков Алексей Николаевич!
В реальном режиме есть регистр eax, он никуда не делся (если, конечно, ты не программируешь на 80286) :). Чтобы получить к нему доступ, нужно ассемблеру указать директиву выбора процессора, который поддерживает 32-х разрядные регистры (например .386). После этого умножение можно реализовать за 2 команды.
но как я понимаю, от тебя ждут не этого. тогда можно реализовать умножение 32-х разрядных чисел на 16-ти разрядной машине. это будет выглядеть примерно так же, как умножение в столбик. допустим, у нас есть два числа А и В, которые надо перемножить. обозначим их старшие и младшие части как H и L (AH, AL, BH, BL - не путай с регистрами процессора). Тогда получим:
C = A*B = AL*BL + (AL*BH + BL*AH)*D + (AH*BH*)*D*D, где D - это разрядность операндов (т.е. 2^16 или 65536). Т.к. D = 2^16, то умножение на него сводится к простому сдвигу влево на 16 разрядов, а сложение 64-х разрядного числа лекго выполнить с помощью команд ADD/ADC.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 29.08.2005, 11:11


Вопрос № 25.488
Вопрос:
Как я вас понимаю, то я должен дойное слово разложить на старшее слово - H, и младщее - L, т.е. 01482316h - H = 0148, L = 2316h, а что делать 0237h? вы имеете в виду, что я должен разложить его так: H-02h, L-37h?
Вот, что получается:
A=0148 2316h
B=02 37h
AL=2316
AH=0148

BL=37
BH=02

D = 10000h

Я умножаю двойное слово на слово, а не двойное слово на двойное слово!
Уменя не получилось!
Отправлен: 29.08.2005, 13:06
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Вiктор
Здравствуйте, Терсков Алексей Николаевич!
я не совсем понял ваш вопрос.
"а что делать 0237h?" - это слово. Если же считать его двойным словом, то H = 0h, L= 0237h.
Или у вас задание сделать умножение двойного слова на слово на 16-битной машине?
---------
Turbodebugger - это вам не цацки-пецки...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 29.08.2005, 18:08
Оценка за ответ: 5
Комментарий оценки:
Мне нужно сделать умножение двойного слова на слово! на компьютере 8088


Вопрос № 25.508
Здравствуйте уважаемые эксперты!
1. Нет ли у кого-нибудь библиотек(*.lib) кодирования или декодирования музыки, видео или вообще чего-нибудь?
2. Возможно ли под Visual C++ 6.0 создать lib файл, что бы он был совместим с MASM32, если да тока (пример)?
Отправлен: 29.08.2005, 20:01
Вопрос задал: Алексей Смуриков (статус: Практикант)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Вiктор
Здравствуйте, Алексей Смуриков!
1. у меня вроде нет. Попробуйте поискать в сети...
2. я не проверял, но думаю что да. Вы создаёте .cpp файл, компилируете его, получаете файл .obj (если не выйдет в оболочке, можно попробовать консольный компилятор cl.exe, но я думаю что и из оболочки всё выйдет. ); далее вы используете утилиту lib.exe, (папка bin, у меня она находится в Microsoft Visual StudioVC98) и с её помощью делаете .lib- файл.
а дальше этот .lib- файл задаёте МАСМ-овскому линковщику при линковке вместе с другими библиотеками.
т.к. МАСМ и Visual C++ 6.0 оба продукты Microsoft, то они должны нормально совмещаться.
я когда-то на ТАСМ делал .lib-файлы. Думаю что и то что вы задумали вполне осуществимо. Попробуйте. Если будут трудности - спрашивайте.
---------
Turbodebugger - это вам не цацки-пецки...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 29.08.2005, 21:03
Оценка за ответ: 4

Отвечает: Sager
Здравствуйте, Алексей Смуриков!
Примеры можешь глянуть в пакете masm'a(например здесь C:masm32examplescraven). А вообще тебе нужно использовать API
DirectSound и DirectSound3D для работы со звуком. Примеры можно глянуть здесь(там правда не на асме, но перевести на асм труда не составит):
WWW.DELPHISYTE.RU/ARTICLES/FIRST/UROKI_PROGRAMMIROVANIE_ZVUKA_V_DIRECTSOUND.HTM

DELPHIRUS.COM.RU/DELPHI-SOVET-CAT-30.HTML
Ответ отправил: Sager (статус: 5-ый класс)
Отправлен: 30.08.2005, 08:46
Оценка за ответ: 4


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

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

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

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

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


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


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

Яндекс


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

В избранное