Вопрос № 44451: Еще один вопрос... Что неверно в этой программе (открытие текстового документа), возможно я что то не так понял, помогите плз.....Вопрос № 44493: В третий раз за сегодня....
Вопрос на тему "односимвольного" калькулятора :). Вобщем со сложением и вычитанием проблем нет. В ниже указаном примере(вычитание), работает... Но когда перешел к умножению и делению "такого вида" в...
Вопрос № 44.451
Еще один вопрос... Что неверно в этой программе (открытие текстового документа), возможно я что то не так понял, помогите плз..
Отвечает: Пан Павел Константинович
Здравствуйте, Бородин Евгений Викторович / kain!
Если вы решаете такую задачу то я вам рекомендую делать это через модель памяти TINY т.е. формат файла *.COM, где все сегментные Регистры равны между собой, это уменьшит код программы и упростит сопровождение.
Далее идёт код который демонстрирует только Открытие и Закрытие файла.
CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
;====================
;Open file
;OUT: ax = handle
mov ax,3D00h
lea dx,filename
int 21h
;====================
xchg ax,bx ;bx = handle
;====================
;Close file
mov ah,3Eh
int 21h
;====================
ret ;exit
;====================
filename db '1.txt',0
CSEG ends
end Begin
У вас в коде есть отрывок:
mov [numb],ax ;Здесь вы сохраняете Handle
mov ah,3Fh ;Номер функции Чтения из Файла
mov cx,0FF00h ;Колличество считываемых байт
mov dx,offset Buffer ;Адрес буфера куда будут читаться данные
int 21h
Этот отрывок предназначен для чтения из файла. В данном отрывке не хватает загрузки в регистор BX, хэндла файла т.е. правельная версия выглядит так:
mov [numb],ax ;Здесь вы сохраняете Handle
mov bx,ax ;bx = HANDLE FILE
mov ah,3Fh ;Номер функции Чтения из Файла
mov cx,0FF00h ;Колличество считываемых байт
mov dx,offset Buffer ;Адрес буфера куда будут читаться данные
int 21h
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: Студент)
Ответ отправлен: 28.05.2006, 14:45 Оценка за ответ: 5
Вопрос № 44.493
В третий раз за сегодня....
Вопрос на тему "односимвольного" калькулятора :). Вобщем со сложением и вычитанием проблем нет. В ниже указаном примере(вычитание), работает... Но когда перешел к умножению и делению "такого вида" возникли проблемы. Умножение заменил сложением с помощью цыкла(loop), второе чило приравнивается СХ, тоесть к первому числу прибавляется определенное количество раз само к себе - с горем получилось... А вот с делением в голову ничего не пришло...помогите. И если можно...может умножение можно както
подругому отобразить? :)
Отвечает: mix_mix
Здравствуйте, Бородин Евгений Викторович / kain!
А чего Вы хотите добится сложением? Вас пугают инструкции mul/imul? Да, с делением, используя процессор, туговато, не спорю. Но тогда используйте сопроцессор. Если плохо про него знаете, то можно почитать здесь: http://wasm.ru/article.php?article=edfpu02. Если будете сами переводить число в строку, то можно добится операций с числами до 2 в 80 степени :). Кстати, fpu поддерживает числа с плавающей точкой (надеюсь у Вас программа не под 8086 процессор :), а это всего лишь 1208925819614629174706176.
P.S. На форуме wasm.ru Вы можете тоже задавать свои вопросы. Сайт целиком посвящен низкоуровнемому программированию.
Ответ отправил: mix_mix (статус: 3-ий класс)
Ответ отправлен: 28.05.2006, 17:32
Отвечает: Пан Павел Константинович
Здравствуйте, Бородин Евгений Викторович / kain!
Мне очень нравиться тот факт, что все сообщения у вас выдаються на Англ. так держать.
Есть для операций Умножения и Деления в Ассемблере такие команды как mul/imul(Умножения), div/idiv(Деление). Надо отметить что это специфичные команды, а именно ОНИ имеют так назыв. не явные Операнды.
*******************************************************************
Описание команды Умножения mul/imul:
MUL (MULtiply - БЕЗНАКОВОЕ умножение)
IMUL (Integer MULtiply БЕЗНАКОВОЕ умножение)
Неявные операнды команд mul/imul:
Если Длина Источника = Байт, то Множимое = AL и Произведение = AX
Если Длина Источника = СЛОВО, то Множимое = AX и Произведение = DX:AX
******************************************************************
Команда Деление(div/idiv) очень похоже на умножение.
Если Длина Источника = Байт, то Делимое = AX, Частное = AL и Остаток = AH
Если Длина Источника = СЛОВО, то Делимое = DX:AX, Частное = AX и Остаток = DX