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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2010, 00:52   #1
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Ввод двух одноразрядных положительных целых десятичных чисел, возведения второго числа в степень, задаваемую первым и вывод результата на экран
Код:
title   lab_work1.exe 
vars   segment para pablic 'data'
vars   ends      ; Сегмент данных
stk     segment stack
         db 256 dup ('?')
stk     ends      ; Сегмент стека
text    segment para public 'code'     ; объявление сегмента кода
         assume cs:text, ds:vars, ss:stk
myproc proc
        ;дальше возможно так:
        ;в регистр СХ заннести первый операнд
        ;а в регистр ВХ второй
        ;дальше поставить метку и ВХ умножить на ВХ(запоминая результат ;в ВХ)
         ;возвратится к метке
mov ah, 02
mov dx, bx
int 21
myproc	endp
text	        ends
end		myproc
Я в отчаянии
Все что знаю по ассемблеру я написал, но этого слишком мало для выполнения лабораторной работы. очень надеюсь на помощь

Я пытался написать код под Tasm, но буду благодарен если напишите хоть под какой-нибудь
Skype: CODERua

Последний раз редактировалось Stilet; 03.02.2010 в 17:00.
[CODER] вне форума Ответить с цитированием
Старый 03.02.2010, 05:18   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

[CODER]
Если в целых беззнаковых числах, то так
Код:
mov DX,0; регистр DX пригодится в дальнейшем
mov AX,Num1; число которое будут возводить в степень
mov CX,Num2; степень числа
dec CX
a1:  mul Num1
       loop a1
; результат в DX:AX
дальше сам

Последний раз редактировалось Mikl___; 03.02.2010 в 05:22.
Mikl___ вне форума Ответить с цитированием
Старый 03.02.2010, 16:02   #3
KIV_95
 
Регистрация: 02.02.2010
Сообщений: 5
По умолчанию

Цитата:
mov DX,0; регистр DX пригодится в дальнейшем
это не обязательно. регистр DX все равно затрётся командой mul.
KIV_95 вне форума Ответить с цитированием
Старый 04.02.2010, 07:21   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Спасибо, KIV_95 то то я смотрю на больших числах неправильный результат
[CODER]
Задача оказалась не из простых
Код:
.286; чтобы нормально скомпилировался СОМ-файл
.model tiny
.code
org 100h
start:
.386; дальше инструкции для 32-разрядного процессора
	mov eax,X; число
	mov ecx,Y; степнь
	test ecx,ecx
	jnz a0
	mov buffer,'1'; любое число в 0-ой степени =1
	jmp a2; выводим результат
a0:	cmp ecx,1
	jnz a1
	mov dword ptr Data_Int64,eax; любое число в 1-ой степени
	jmp b1	
a1:	mov edi,offset buffer
	mul X
        mov dword ptr Data_Int64,eax;младшая часть 64-разрядного числа
	mov dword ptr Data_Int64+4,edx;старшая часть 64-разрядного числа
	cmp ecx,2
	jz b1; если степень равна 2
	sub ecx,2; если степень больше 2
a3:	mov eax,dword ptr Data_Int64+4
	mul X
        mov dword ptr Data_Int64+4,eax
	mov eax,dword ptr Data_Int64
	mul X
        add dword ptr Data_Int64+4,edx
	mov dword ptr Data_Int64,eax
	loop a3
b1:	fninit			;сброс сопроцессора
	fild Data_Int64		;загрузить число в двоичном коде
	fbstp Data_BCD		;извлечь число в коде BCD
	mov ecx,9               ;в десятом байте информация о знаке числа
b2:     cmp byte ptr [ecx-1+Data_BCD],0
	jnz b3         
	loop b2      		;пропускаем незначащие (нулевые) разряды слева
b3:	mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов
        cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
	ja b4
	add al,30h		;младшую тетраду переводим в ASCII
	stosb
	dec ecx
b4:     xor ax,ax		;распаковываем остальные разряды числа
	mov al,byte ptr [ecx-1+Data_BCD]
	shl ax,4    		;выделяем старшую и младшую тетрады
	shr al,4
	add ax,3030h		;переводим в ASCII-код
	xchg ah,al
	stosw
	loop b4
a2:	mov ax,3;очищаю экран
	int 10h
	mov ah,9; вывожу результат
	mov edx,offset buffer
	int 21h
	mov ah,0; жду нажатия на любую клавишу
	int 16h	
	retn; выхожу из программы
buffer	db 25 dup ('$')
X dd 81
Y dd 9;81^9=150094635296999121
Data_Int64   dq 0;64-разрядное число
Data_BCD     dt 0;число в BCD-формате
end start

Последний раз редактировалось Mikl___; 04.02.2010 в 07:25.
Mikl___ вне форума Ответить с цитированием
Старый 04.02.2010, 12:38   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию


То же самое, но с использованием FPU
Код:
.286
.model tiny
.code
org 100h
start:
.386	
	finit ;
	fldln2;st(0):=ln(2)
	fild X;st(0):=X, st(1):=ln(2)
	fyl2x;st(0):=st(1)*log2(st(0))=ln(2)*log2(x)
	fimul dword ptr Y;st(0):=ln(2)*log2(x)*Y
	FLDL2E;st(0):=log2(e) st(1):=ln(2)*log2(x)*Y
	FMULP ST(1),ST(0);st(0):=ln(2)*log2(x)*Y*log2(e)
	FLD ST(0);copy the logarithm; st(1):=st(0):=ln(2)*log2(x)*Y*log2(e)
	FRNDINT;keep only the characteristic
	FSUB ST(1),ST(0);keeps only the mantissa
	FXCH ST(1);get the mantissa on top
	F2XM1;->2^(mantissa)-1
	FLD1;st(0)=1.0
	FADDP ST(1),ST(0);add 1 back
;the number must now be readjusted for the characteristic of the logarithm
	FSCALE;scale it with the characteristic
	mov edi,offset buffer
	fbstp Data_BCD		;извлечь число в коде BCD
	mov ecx,9               ;в десятом байте информация о знаке числа
b2:     cmp byte ptr [ecx-1+Data_BCD],0
	jnz b3         
	loop b2      		;пропускаем незначащие (нулевые) разряды слева
b3:	mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов
        cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
	ja b4
	add al,30h		;младшую тетраду переводим в ASCII
	stosb
	dec ecx
b4:     xor ax,ax		;распаковываем остальные разряды числа
	mov al,byte ptr [ecx-1+Data_BCD]
	shl ax,4    		;выделяем старшую и младшую тетрады
	shr al,4
	add ax,3030h		;переводим в ASCII-код
	xchg ah,al
	stosw
	loop b4
a2:	mov ax,3;очищаю экран
	int 10h
	mov ah,9; вывожу результат
	mov edx,offset buffer
	int 21h
	mov ah,0; жду нажатия на любую клавишу
	int 16h	
	retn; выхожу из программы
buffer	db 25 dup ('$')
X dd 81
Y dd 9;81^9=22876792454961=14CE6B167F31h
Data_BCD     dt 0;число в BCD-формате
end start

Последний раз редактировалось Mikl___; 04.02.2010 в 12:42.
Mikl___ вне форума Ответить с цитированием
Старый 11.04.2014, 00:29   #6
g_m_s
Новичок
Джуниор
 
Регистрация: 14.12.2011
Сообщений: 1
Сообщение

Mikl___, помогите пожалуйста разобраться с вашей программой
Мне необходимо написать программу которая ожидает ввода целого числа (отрицательного или положительного) и выводит значение квадрата этого числа. Причем вводимое число может быть достаточно большим по модулю - более 65535, но не больше 4294967295 (двойного слова достаточно). Соответственно результат может/должен быть 64 разрядным числом. FPU, WINAPI и/или сторонние библиотеки использовать нельзя по заданию.

В вашей программе есть практически все что нужно реализовано , но я не могу ее правильно скомпилировать и поправить.

1) Если пытаться скомпилировать код так как он есть в вашем сообщении в tasm16, то вывод:
C:\Program Files\TASM Visual>cd C:\Program Files\TASM Visual\tasm\ & tasm 1.asm & exit
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
**Error** 1.asm(18) Forward reference needs override
**Error** 1.asm(25) Forward reference needs override
**Error** 1.asm(28) Forward reference needs override

Изменение директив и моделей памяти не помогают скорее всего из-за моего непонимания их применимости в той или иной программе.

2) Удалось скомпилировать программу только на tasm32 в таком виде:

Код:
.586
.model flat
.code
org 100h
start:
 ;дальше инструкции для 32-разрядного процессора
	mov eax,X; число
	mov ecx,Y; степнь
	test ecx,ecx
; далее без изменений
Но программа завершается с ошибкой. Исследуя состояние регистров в отладчике я вижу правильное значение произведения EDX:EAX, затем, следующая команда
Код:
 mov dword ptr Data_Int64+4,eax
должна считать EAX для использования значения в следующей итерации, но происходит ошибка - см. на картинке окно отладчика.
debug.jpg

Когда то я занимался программированием на ассемблере для микроконтроллеров AVR и MCS-51 совместимых и общее представление о низкоуровневых языках имею , но для x86 впервые и особенностей не знаю вообще - подскажите хотя бы как скомпилировать эту (первую, без FPU) программу и какие есть особенности для моей задачи - дальше буду пробовать сам разбираться.

Если важно то:
TASM16 версия 4.1
TASM32 версия 5.0
Windows 7 32 битная sp1
g_m_s вне форума Ответить с цитированием
Старый 14.04.2014, 10:18   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

g_m_s,
плюнь на ТАСМ и собери программу МАСМом
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
возведение в степень ILNARM Паскаль, Turbo Pascal, PascalABC.NET 16 16.10.2009 23:04
Возведение в степень. Рекурсии Иван 883 Помощь студентам 1 24.03.2009 19:42
возведение в степень Lissisa Помощь студентам 1 21.03.2009 22:34
Возведение в степень Stanislav Общие вопросы Delphi 10 05.12.2007 23:34
Возведение в степень... Sota Общие вопросы C/C++ 7 18.07.2007 17:05