Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите разобраться с программой на ассемблере (http://forum.oszone.net/showthread.php?t=274527)

Shenochek 23-12-2013 10:40 2277170

Помогите разобраться с программой на ассемблере
 
Доброго времени суток. Есть написанная программа, направленная на возведение числа в степень с использованием возможностей математического сопроцессора. Код взят с какой-то методички. Вопрос заключается в том, почему она корректно не запускается, и что можно сделать, чтобы она всё-таки запустилась? Компилировал через 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 2277173

Цитата:

Цитата Shenochek
почему она корректно не запускается, и что можно сделать, чтобы она всё-таки запустилась? »

А что пишет, как ругается. Операционная система под которой запускаете, какая?

Shenochek 23-12-2013 10:52 2277174

Цитата:

Цитата yurfed
А что пишет, как ругается. Операционная система под которой запускаете, какая? »

yurfed, Операционная система Windows XP. При линковке пишет предупреждение Warning: No stack.
Программа собирается и при её запуске выводится куча невразумительных крякозябров.

AMDBulldozer 23-12-2013 18:24 2277374

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

Efir 23-12-2013 19:08 2277392

Цитата:

Цитата Shenochek
Вопрос заключается в том, почему она корректно не запускается »

Цитата:

Цитата Shenochek
При линковке пишет предупреждение Warning: No stack. »

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

Цитата:

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

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

Цитата:

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

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

Shenochek 23-12-2013 20:07 2277414

Цитата:

Цитата AMDBulldozer
простите, а чем Вы её компилируете и какой формат исполняемого файла? »

AMDBulldozer, По малоопытности пытался скомпилировать в exe.
Цитата:

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

Efir, Если вас не затруднит, то можете более подробно объяснить как это сделать, когда я попытался по вашему совету использовать ключ /t (tlink /t 2.obj) для сбора и нажал Enter, в командной строке просто появился мигающий курсор и ничего больше не происходит уже минут как 10.

Efir 23-12-2013 20:21 2277420

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

Shenochek 23-12-2013 20:37 2277428

Цитата:

Цитата Efir
нет ничего особо подробного, компилируете в объектник, компонуете в com. Для ассемблера никаких ключей кроме имени исходника ненадо, раз у вас уже собирался объектник. Для компоновщика строка выглядеть должна как и показали. »

Efir, Пересобрал объектник без ключей.
Цитата:

Цитата Efir
Для компоновщика строка выглядеть должна как и показали. »

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

Efir 23-12-2013 20:56 2277435

Цитата:

Цитата Shenochek
А, так как в ассемблере я далеко не профи, то обращаюсь за помощью к более опытным форумчанам »

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

Цитата:

Цитата Shenochek
Fatal: 32-bit record encountered in module C:\ASM\2.ASM »

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

Shenochek 23-12-2013 21:09 2277440

Цитата:

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

Efir, Спасибо вам огромное, добавил ключ и всё получилось, программа откомпановалась :)

Efir 23-12-2013 21:19 2277447

Shenochek, пожалуйста, желаю здать на пятерку :)


Время: 23:56.

Время: 23:56.
© OSzone.net 2001-