Вопрос № 20607: Здравствуйте, уважаемые эксперты!
Помогите решить следующую задачу.
Нужно перевести число, хранящееся в паре dx:ax в строку. Казалось бы всё так просто, но нужно использовать только команды 286 процессора(на нём нет 32х битных регистров). Я п...Вопрос № 20614: Здравствуйте! Написана программа на ассемблере, которая переводит 16-разрядное число в символьном виде в двоичное.
Программа компилируется без ошибок. Но не работает.
Помогите, кто сможет.
Спасибо!...Вопрос № 20615: Здравствуйте, была написана программа по следующему условию.
Составить программу для 16-разрядного процессора, реализующую следующее задание:
Адрес окружения программы находится в префиксе прграммного сегмента (PSP – область, с которой загруж...Вопрос № 20628: Добрый день!
В книге Зубкова есть такой пример:
; nolock.asm
; самая короткая программа для выключения NumLock, CapsLock и ScrollLock
; запускать без параметров
.model tiny
.code
org 100h ; СОМ-файл. АХ при запуске СОМ-...
Вопрос № 20607
Здравствуйте, уважаемые эксперты!
Помогите решить следующую задачу.
Нужно перевести число, хранящееся в паре dx:ax в строку. Казалось бы всё так просто, но нужно использовать только команды 286 процессора(на нём нет 32х битных регистров). Я понимаю, что нужно делить пару на 10, но как это делать, ведь частное может не поместиться в ax. Ещё вариант - делить на 10000 и потом отдельно рассматривать частное и остаток, но и в этом случае частное может не поместиться в ax. Что делать? Помогите
Отправлен: 09.05.2005, 16:54
Вопрос задал: Ермаков Алексей (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Евгений Иванов
Здравствуйте, Ермаков Алексей!
ты ещё калькулятор используй. или счёты. ;)
если 32 бита, то это 4 миллиона.
есть команда деления DIV.
ты должен знать пределы чисел, ч которыми работаешь. и делить_сразу_на нужный коэффициент.
если не знаешь, то можно проверять на границы десятков и снижать коэффициент.
хотя разделить ты сможешь всего на 65536, не более.
так что на большие числа тебе придётся делить столбиком.
или применяй матем_сопроцессор, что намного проще.
опять же, наибольшее число, которое ты можешь узнать, это 27100000h
числа больше этого дели на числа больше 10000, например, на 60000, а потом применяй восстанавливающий алгоритм.
число 805306368:
805306368/60000 =
13421, в остатке будет 46368
коэффициент 6.
значит, умножаем на 13421 * 6 = 13A8Eh
получаем первую цифру = 3.
и т.д.
надеюсь, если у тебя логика работает, ты продолжишь этот алгоритм ;)
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 09.05.2005, 18:18
Вопрос № 20614
Здравствуйте! Написана программа на ассемблере, которая переводит 16-разрядное число в символьном виде в двоичное.
Программа компилируется без ошибок. Но не работает.
Помогите, кто сможет.
Спасибо!
Приложение:
Отправлен: 09.05.2005, 21:17
Вопрос задал: MMM72 (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Boriss
Здравствуйте, MMM72!
А кто 256 байт зарезервирует под PSP?
(!!!!) То есть нужно добавить
ORG 100h
Приложение:
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 11.05.2005, 17:19
Отвечает: Стас
Здравствуйте, MMM72!
Если все равно COM или EXE откомпили в COM(добавь Org 100h) и все будет Ок!
Если EXE то нужно её привести в EXE вид: ставишь .model small, делишь прогу на сегменты,
вместо int 20h - mov ax,4c00h int 21h... лучше исправленный код приклеплю.
Компилирушь, a.asm:
tasm /m a;
tlink a /3
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 14 суток с момента отправки ответа.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 12.05.2005, 01:10
Вопрос № 20615
Здравствуйте, была написана программа по следующему условию.
Составить программу для 16-разрядного процессора, реализующую следующее задание:
Адрес окружения программы находится в префиксе прграммного сегмента (PSP – область, с которой загружается соответствующая программа) со смещением 2Ch. Сегментный адрес PSP находится в регистрах DS и ES при старте программы.
Структура среды окружения:
db строка_1,0
db строка_2,0
…
db строка_т,0,0,хх,0
db строка_запуска_программы 0
1. Необходимо получить из PSP адрес окружения, по этому адресу в среде окружения найти строку, которая описывает путь запуска программы, выдать ее на экран и номер этой строки.
2. Выдатиьстроку с номером 5, 79. Если строки с заданным именем не существует выдать сообщение «Строка не найдена»
3. Выдать все строки содержащие символ @, в формате:
Строка 5: содержимое_строки. Если строки не существует, выдать соответствующее сообщение.
Все работает! Но единственное, что нужно, как сделать, чтобы эта программа компилировалась в .ехе, а не .com файл. Простое убирание строчки
ORG 100h не помогает. Спасибо
Приложение:
Отправлен: 09.05.2005, 21:20
Вопрос задал: MMM72 (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, MMM72!
модель поставь другую - small.
assume тоже поставь.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 09.05.2005, 21:56
Отвечает: Ayl
Здравствуйте, MMM72!
1. Модель не должна быть TINY!
2. ORG 100h не нужен. Поставь ORG 0
3. Вместо команд push cs/pop ds напиши следующее:
mov ax, @DATA
mov ds, ax
4. Для завершения программы вместо ret используй mov ax, 4c00h/int 21h
5. Добавь сегмент стека
6. После .CODE напиши директиву ASSUME: ASSUME cs:CODE, ss:STACK, ds:DGROUP либо используй директиву .STARTUP (тогда не нужен пункт 3)
7. Убери ключ /t из команды линковщика
Вроде все.
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 11.05.2005, 16:39
Вопрос № 20628
Добрый день!
В книге Зубкова есть такой пример:
; nolock.asm
; самая короткая программа для выключения NumLock, CapsLock и ScrollLock
; запускать без параметров
.model tiny
.code
org 100h ; СОМ-файл. АХ при запуске СОМ-файла без параметров
; в командой строке всегда равен 0
start:
mov ds,ax ; так что теперь DS = 0
mov byte ptr ds:0417h,al ; байт состояния клавиатуры 1=0
ret ; выход из программы
end start
прогоняю его он никаких NumLock, CapsLock и ScrollLock не отключает(лампочки горят).
Попробовал такую программу
.model tiny
.code
org 100h ; СОМ-файл. АХ при запуске СОМ-файла без параметров
; в командой строке всегда равен 0
start:
mov ax,0040h
mov ds,ax
xor ax,ax
mov byte ptr ds:0017h,al ; байт состояния клавиатуры 1=0
ret ; выход из программы
end start
то же самое не отключает
Хотя в ячейку[0040h : 0017h] 0 записывает.
Что здесь может быть? Использую win2000.
Заранее спасибо.
Отправлен: 10.05.2005, 12:01
Вопрос задал: r900 (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: Евгений Иванов
Здравствуйте, r900!
это должно запускаться под чистым досом.
чтобы выключить/вкл лампочки, лучше работать с портами.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 10.05.2005, 21:29
Отвечает: Вiктор
Здравствуйте, r900!
Я это объяснить не могу, но расскажу про свой опыт. у меня Windows 98.
я в дебаггере менял значение этой ячейки, и лампочки загорались/погасали.
я также делал аналогичную программу, которая меняла значения той ячейки. Значения ячейки менялись, но лампочки не загорались.
но после нажатия любой кнопки лампочки принимали нормальный вид, соответствующий значениям ячейки.
тогда в программу после замены значения ячейки добавил принудительный вызов прерывания 9Н. тогда лампочки стали загораться как положено.
вот как моя программа работает у меня:
сначала все лампочки выкл.
запускаю программу - все загораются.
нажимаю кнопку - остаётся гореть только NUM LOCK.
нажимаю курсорную стрелку - опять все горят.
вот такие пироги.
согласен с Евгением Ивановым - под досом это должно работать нормально, без выбрыков.
Пусть боле сведущие эксперты объяснят вам это, а я тоже послушаю.
Приложение:
Ответ отправил: Вiктор (статус: 3-ий класс)
Отправлен: 11.05.2005, 16:20
Отвечает: Стас
Здравствуйте, r900!
Насколько я знаю эти ячейки используются БИОС только для того чтобы знать горят ли лампочки или нет. Их изменение никак не скажется на самих лампочках.
Чтобы зажигать гасить лампочки программируют порты, по моему так:
mov al,0edh ; команда изменения лампочек
out 64H,al
mov al,0;выключить, бит 1 - scroll, бит 2 - Num, бит 3 - Caps, напр. 5 - Scroll+Caps горят
out 60H,al
Ответ отправил: Стас (статус: Практикант)
Отправлен: 12.05.2005, 01:01