Вопрос № 36279: Здравствуйте!
Приобрёл книгу Олега Калашникова "Ассемблер это просто" С языком столкнулся впервые и хотел задать вопрос по поводу регистров процессора (ax; bx; cx; dx) В книге не упомянули для каких именно случаев используется тот или и...Вопрос № 36280: 1) Ребята, а какой код у Enter?
2) Почему команда mov ax,3D02 (и далее 3F и закрыть 3Е) не запускает файл напр. DOOM.exe , а файл .jpeg проходит нормально, т.е . программа пишет "Файл загружен в память". И все что ли? Что она делае...Вопрос № 36312: Здраствуйте!
этот вопрос уже задавал, вот только на практике так и не понял.
Как сделать чтобы в программе введенная строка использовалась как имя файла!
ниже пример который не работаеть, подскажите как его переделать!
Буду очень благ...Вопрос № 36350: Уважаемые эксперты.
вопрос такой: например mov ax,3D00h что будет содержать ah и al? Если mov ax,3Fh что будет содержать ah и al? И почему? Как будут вышеперечисленные числа выглядеть в 16-ти разрядном (типа ah=3D00 0000) виде? Почему?
С...
Вопрос № 36.279
Здравствуйте!
Приобрёл книгу Олега Калашникова "Ассемблер это просто" С языком столкнулся впервые и хотел задать вопрос по поводу регистров процессора (ax; bx; cx; dx) В книге не упомянули для каких именно случаев используется тот или иной регистр. Попробовал в программе из первой главы заменить mov ah,9 на mov ah,10 или даже mov bx,9. В результате программа даже не выполнялась. Получается, что каждый регистр (ax; bx; cx; dx) ответственен за какую то определённую функцию, но вот за какую - не написано.
Заранее благодарю.
Отправлен: 26.02.2006, 22:52
Вопрос задал: Paltus (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Пан Павел Константинович
Здравствуйте, Paltus!
Всё очень просто. Регистр это переменная размером в 2-а байта <AX>=<AH>+<AL>
<AX> = 2 байта
<AH> = 1 байт
<AL> = 1 байт
Регистры можно классифицировать. Вам не обходимо пока знать что <AX>, <BX>,<CX>,<DX> - это Регистры Общего назначения. Почему у вас программа не выполнилась или выполнилась но не так как надо так это потому что регистр <ah> и его значение 09h завязаны между собой создателями прерывания int 21h для выполнения определенной задачи (например вывод инфор. на экран) и только такая связь, будет давать результат вывода инфор. на экран, на рушив эту связь вы обрекаете себя на случайность
потому что кто знает какой результат будет после выполнения задачи которая определилась с такой связью регистра-значения
(mov ah,10h).
Итог:
В контексте
mov ah,09h
int 21h
ah = 09h - является возбудителем определёной функции(фун-ии вывода на экран)
Какой Регистр и какое Значение, выбрать для возбуждения определёной функции, оговаривается в Спецификациях которые вы можете найти на сайте http://www.kalashnikoff.ru/
С, Уважением MnEm0n!C
Отвечает: FreeManC
Здравствуйте, Paltus!
Просто через аh передаётся номер функции прерывания, в других регистрах могут быть параметры. А так можно как угодно использовать ax,bx,cx,dx,bp,si,di (вроде ничего не упустил). Просто некоторые из них могут участвовать в спецыфических операциях.
Ответ отправил: FreeManC (статус: 1-ый класс)
Отправлен: 27.02.2006, 16:39
Вопрос № 36.280
1) Ребята, а какой код у Enter?
2) Почему команда mov ax,3D02 (и далее 3F и закрыть 3Е) не запускает файл напр. DOOM.exe , а файл .jpeg проходит нормально, т.е . программа пишет "Файл загружен в память". И все что ли? Что она делает? Код приложен.
Что конкретнее делают эти инструкции? И можно ли с их помощью запустить на выполнение нужный exe_шник?
Всекм спасибо.
Приложение:
Отправлен: 26.02.2006, 23:06
Вопрос задал: Baim (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Пан Павел Константинович
Здравствуйте, Baim!
Enter - [ScanCode] - 1Ch
Enter - [Управляющие код] - CRLF - CR=0Dh, LF=0Ah
Да, эта программа токо загружает в память определеное колличество байт в вашем случае 65280 байт, потом она закрывает файл и ВСЁ!!!
Теоритически чтобы запустить *.exe файл необходимо считать его полностью в память при этом память должна быть после записи туда вашего *.exe не доступна для записи в неё, затем надо передать управление на счтаный вами в память *.exe файл. При этом соблюдать специфику ОС и формата EXE-file и адресов
Совет: Поставьте опыт в ОС = ДОС, c типом файла *.COM
Здраствуйте!
этот вопрос уже задавал, вот только на практике так и не понял.
Как сделать чтобы в программе введенная строка использовалась как имя файла!
ниже пример который не работаеть, подскажите как его переделать!
Буду очень благодарен!
p.s я мог ошибиться и с открытием файла, не обращайте на это внимания главные строки выше!
Приложение:
Отправлен: 27.02.2006, 12:22
Вопрос задал: Gwest (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Ayl
Здравствуйте, Gwest!
Ты неправильно определяешь буфер для ввода строки. Точнее говоря, у тебя вообще нет буфера, а есть только однобайтовое поле со значение 25.
К тому же для функции 0ah буфер должен иметь определенный формат:
<max>,<?len>,<buffer>
где <max> - размер буфера (1-254), <?len> - один байт для возврата длины введенной строки, <buffer> - max байт для сохранения введенных символов.
Введенная строка завершается символом 0dh, т.е. реально максимальная длина строки будет max-1.
См. в Приложении чтение строки.
Приложение:
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик)
Отправлен: 27.02.2006, 12:43 Оценка за ответ: 4
Отвечает: Беляев Валерий (ака seaman)
Здравствуйте, Gwest!
Буферизованный ввод с клавиатуры:
Буфер перед вводом функцией 0a/int 21 надо организовать.
1-й байт - максимальное число байт в буфере
2-й байт - число литер из последнего ввода, которые могут быть оставлены.
После ввода (заканчивается по ENTER)
2-й байт = число введенных литер, исключая ENTER.
далее сами литеры, включая ENTER.
Соответсвенно ошибки.
1. В твоем варианте буфер всего 1 байт длиной!
db 25 - резервирует 1 байт и делает его равным 25.
надо типа:
db 25, 23
dup 23 db 0
2. После ввода заносим 0 не в BUFFER+1, а в BUFFER+[BUFFER+1]+2
Здесь [BUFFER+1] - это содержимое второго байта буфера, т.е. число введенных литер.
Соответственно, т.к. для функции 3DH/int 21 нужна строка ASCIIZ, ей нужно передавать адрес самой строки, а она у нас начинается с BUFFER+2
В общем будет нечто вроде того, что в приложении.
ЗЫ: прогу в приложении я не компилил - может и не работать, если что-то я просмотрел.
Приложение:
Ответ отправил: Беляев Валерий (ака seaman) (статус: 3-ий класс)
Отправлен: 27.02.2006, 12:59 Оценка за ответ: 5 Комментарий оценки: Мля... только щас дошло =)
Отвечает: Пан Павел Константинович
Здравствуйте, Gwest!
Я набросал вам код для понимания механизмов работы
1. Эта программа сделана таким образом чтобы файл создовался когда вы введете стороку равной три сомвола не меньше и не больше. Ваша задача остаётся только сделать так чтобы вы могли ввести имя файла равной больше или меньше 3 символов т.е. как надо в обычных программах.
2. Обраьтите внимание на ASCIIZ строки которые нужны для создания файла.
С, Уважением MnEm0n!C
Приложение:
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 2-ой класс)
Отправлен: 27.02.2006, 23:23 Оценка за ответ: 5
Вопрос № 36.350
Уважаемые эксперты.
вопрос такой: например mov ax,3D00h что будет содержать ah и al? Если mov ax,3Fh что будет содержать ah и al? И почему? Как будут вышеперечисленные числа выглядеть в 16-ти разрядном (типа ah=3D00 0000) виде? Почему?
Спасибо.
Отправлен: 27.02.2006, 20:40
Вопрос задал: Baim (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Евгений Иванов
Здравствуйте, Baim!
AH=3Dh, AL=0.
AH=0, AL=3Fh.
удачи
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.02.2006, 20:48
Отвечает: FreeManC
Здравствуйте, Baim!
mov ax,3D00h
ah=3dh al=0
mov ax,3Fh
al=3fhah=0
насчёт как в памяти - младший байт по младшему смещению
Ответ отправил: FreeManC (статус: 1-ый класс)
Отправлен: 27.02.2006, 22:35
Отвечает: Пан Павел Константинович
Здравствуйте, Baim!
Всё довольно просто:
1. mov ax,3D00h, <ax> - это <ah>+<al>, при этом <ah> - старший чать регистра <ax>, а <al> - младшая чать регистра , в числе 3D00, 3D- старший чать числа, а 00 -младшая чать числа. Вывод:
<ah> = 3Dh
<al> = 00h
Аналогия. Представте вам дали коробку, котороя разделена пополам т.е. коробку с перегородкой, в которой есть камушки, которые находятся в первом и во втором отсеке коробки. Теперь, я попросил вас оставить в коробке всего дав камня, при этом, я вам сказал, что один и второй отсек имеют по 10 камней. При это если хоть один камень будет находится во втором отсеке считать что в коробке находится больше 10-ти камней. Следовательно вы, оставите только 2-а камушка в первом отсеке.
С, Уважением MnEm0n!C
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 2-ой класс)
Отправлен: 27.02.2006, 23:59 Оценка за ответ: 5