Вопрос № 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 ;отступаем
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 ;завершить метку
Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
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, 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
Я умножаю двойное слово на слово, а не двойное слово на двойное слово!
Уменя не получилось!
Отвечает: В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, если да тока (пример)?
Отвечает: В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