Войти

Показать полную графическую версию : [решено] Помогите разобраться с программой на ассемблере


Shenochek
23-12-2013, 10:40
Доброго времени суток. Есть написанная программа, направленная на возведение числа в степень с использованием возможностей математического сопроцессора. Код взят с какой-то методички. Вопрос заключается в том, почему она корректно не запускается, и что можно сделать, чтобы она всё-таки запустилась? Компилировал через Tasm и линковал с помощью Tlink с ключами /x /3. Код программы прикладываю. Буду благодарен всем откликнувшимся.

.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

yurfed
23-12-2013, 10:48
почему она корректно не запускается, и что можно сделать, чтобы она всё-таки запустилась? »А что пишет, как ругается. Операционная система под которой запускаете, какая?

Shenochek
23-12-2013, 10:52
А что пишет, как ругается. Операционная система под которой запускаете, какая? »
yurfed, Операционная система Windows XP. При линковке пишет предупреждение Warning: No stack.
Программа собирается и при её запуске выводится куча невразумительных крякозябров.

AMDBulldozer
23-12-2013, 18:24
Shenochek, простите, а чем Вы её компилируете и какой формат исполняемого файла? Данная программа должна быть построена как исполняемый файл формата "сом" и запускаться в режиме эмуляции процессора 8086. Поскольку она содержит вызовы прерываний BIOS.

Efir
23-12-2013, 19:08
Вопрос заключается в том, почему она корректно не запускается »
При линковке пишет предупреждение Warning: No stack. »

потому, что компоновщик собирает *.exe файл MZ формата, который имеет структуру. А com программа это бинарная программа, код данные и стек которой находятся в одном сегменте, и загрузка его осуществляется совершенно иначе нежели .exe. "Warning: No stack." появляется потому что сегмент стека не объявлен, но для com программы объявление и ненужно т.к. уже сказал находится все в одном сегменте.

Tlink с ключами /x /3 »

свитч /3 - это поддержка 32-х разрядного кода, но даже не в этом дело. Компоновщик должен собрать com файл, для этого по спецификации используется ключ /t.

Операционная система Windows XP »

в хп есть порезаный DOS эмулятор, Debug называется. Отладчик это по факту.

Shenochek
23-12-2013, 20:07
простите, а чем Вы её компилируете и какой формат исполняемого файла? »
AMDBulldozer, По малоопытности пытался скомпилировать в exe.
Компоновщик должен собрать com файл, для этого по спецификации используется ключ /t. »
Efir, Если вас не затруднит, то можете более подробно объяснить как это сделать, когда я попытался по вашему совету использовать ключ /t (tlink /t 2.obj) для сбора и нажал Enter, в командной строке просто появился мигающий курсор и ничего больше не происходит уже минут как 10.

Efir
23-12-2013, 20:21
Shenochek, нет ничего особо подробного, компилируете в объектник, компонуете в com. Для ассемблера никаких ключей кроме имени исходника ненадо, раз у вас уже собирался объектник. Для компоновщика строка выглядеть должна как и показали.

Shenochek
23-12-2013, 20:37
нет ничего особо подробного, компилируете в объектник, компонуете в com. Для ассемблера никаких ключей кроме имени исходника ненадо, раз у вас уже собирался объектник. Для компоновщика строка выглядеть должна как и показали. »
Efir, Пересобрал объектник без ключей.
Для компоновщика строка выглядеть должна как и показали. »
Из пересобранного объектника выполнил компоновку, так же как писал выше в сообщении. Теперь никакого простоя нет, а просто выдаётся сообщение: Fatal: 32-bit record encountered in module C:\ASM\2.ASM. Как быть дальше?
Я заранее прошу прощения за свою назойливость, просто позарез надо разобраться с этой программой. А, так как в ассемблере я далеко не профи, то обращаюсь за помощью к более опытным форумчанам. Даже про то, что ассемблер com программы делает впервые от вас узнал. Век живи, век учись!

Efir
23-12-2013, 20:56
А, так как в ассемблере я далеко не профи, то обращаюсь за помощью к более опытным форумчанам »

я на ассемблере кроме хеллоуворлд ничего не писал:), а турбоассемблер вообще впервые в глаза вижу, просто они с макроассемблером очень похожи.

Fatal: 32-bit record encountered in module C:\ASM\2.ASM »

верните ключ /3. В код не глянул, там оперируют 32-х разрядными регистрами, а точнее 32-х разрядными типами.

Shenochek
23-12-2013, 21:09
верните ключ /3. В код не глянул, там оперируют 32-х разрядными регистрами, а точнее 32-х разрядными типами. »
Efir, Спасибо вам огромное, добавил ключ и всё получилось, программа откомпановалась :)

Efir
23-12-2013, 21:19
Shenochek, пожалуйста, желаю здать на пятерку :)




© OSzone.net 2001-2012