Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2010, 03:19   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Вывод старшей(младшей) части регистра Сx на монитор

У меня имеется задача, согласно которой мне необходимо работать с младшими(low) и старшими(high) частями регистров общего назначения(в эти части регистров машина загружает определённые значения). Для вывода содержимого Сl и Сh мне необходимо загрузить их в сопроцессор, но с помощью команды FLD и FiLD мне машина не даёт это осуществить. Т.е. я пишу примерно следующее:
Код:
.Model Large
.data
viv db ?


.code
..............
MOV viv, Cl
...........
FiLD viv
..............
и на строчке "FiLD viv" машина пишет:"Argument to operation or instruction has illegal size". Я понимаю, что ей не нравится размер переменной viv, но как тогда по-другому вывести число viv на экран, подскажите пожалуйста?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 01.01.2010, 03:44   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

В сопроцессор можно положить не меньше слова. Но причем вообще тут сопроцессор ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 01.01.2010, 05:44   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
В сопроцессор можно положить не меньше слова. Но причем вообще тут сопроцессор ?
А как мне тогда можно вывести значение Cl и Ch на экран? Я знаю, как можно вывести на экран переменную типа "двойное слово", а как вывести на экран переменную в 1 байт я не представляю. В следствии этого, и прошу помочь в выводе.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 01.01.2010, 12:38   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Небольшой пример:
Код:
.MODEL Tiny
.386
.CODE
ORG	100h

Start:

		mov	dx,120         ; Angle = 120
		mov	bx,-10         ; R = -10
		mov	ax,2           ; Y = 2

		finit                  ; Инициализируем сопроцессор (FPU)

		mov	Tmp,dx         ; Сохраняем Angle во временной переменной
		fild	Tmp            ; Загружаем Angle в стек FPU
		fmul	PiDiv180       ; Умножаем: st(0) = Angle * (Pi/180)

		fcos                   ; Косинус: st(0) = Cos(Angle*Pi/180) = -0.5

		mov	Tmp,bx         ; Сохраняем R во временной переменной
		fimul	Tmp            ; Умножаем: st(0) = R * Cos(Angle*Pi/180) = 5

		fistp	Tmp            ; Сохраняем результат во временной переменной
		fwait                  ; Синхронизируем работу CPU и FPU (i8087..i387)
                                       ; (т.к. далее используем Tmp, которое записывает FPU)
		add	ax,Tmp         ; ax = Y + Round(R * Cos(Angle*Pi/180)) = 7

		aam                    ; Делим al на 10 (трюк), частное в ah, остаток - в al
		xchg	al,ah          ; Теперь в al - младшая цифра, а в ah - старшая
		add	ax,'00'        ; Переводим число в десятичное
		int	29h            ; Выводим старшую цифру
		mov	al,ah
		int	29h            ; Выводим младшую цифру

		int	20h            ; Выходим из программы

PiDiv180	dd	0.017453292519943296 ; Pi/180 (думаю, точности dword достаточно)
Tmp		dw	?

END		Start
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 12.01.2010, 04:27   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от Mixim Посмотреть сообщение
У меня имеется задача, согласно которой мне необходимо работать с младшими(low) и старшими(high) частями регистров общего назначения(в эти части регистров машина загружает определённые значения). Для вывода содержимого Сl и Сh мне необходимо загрузить их в сопроцессор
Код:
.Model Large
.data
viv dw ?;<-- важно, FPU может работать только с word, dword, tword
.code
..............; возможны два варианта: 1-ый вариант если в CL число без знака
xor ax,ax;<-- обнулим регистр ax 
MOV al,cl
MOV viv,ax;<-- чтобы не было ошибки "Argument to operation or instruction
;has illegal size" размеры регистра должны соответствовать размеру
;переменной
FiLD viv
..............
xor ax,ax;<-- снова обнулим регистр ax 
MOV al,ch
MOV viv,ax
FiLD viv
.....; 2-ой вариант в CL и CH число со знаком, то AX предварительно обнулять не нужно
mov al,cl
cbw; если al<0 то ah=0FFh если al>=0 то ah=0
mov viv,ax

Последний раз редактировалось Mikl___; 12.01.2010 в 04:37.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод в резидентной части программы bruk_bond Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 12 18.12.2009 11:29
вывод картинки на монитор - dll Olejik Общие вопросы C/C++ 2 25.11.2009 21:28
Вывод области листа MS Excel на 2й монитор vo.one Свободное общение 0 18.08.2009 17:32
Смена регистра Last Microsoft Office Excel 6 12.08.2009 14:52
Вывод части текста из файла CoDeR Общие вопросы Delphi 10 16.08.2007 14:30