Assm - [решено] Помогите разобраться с программой на ассемблере

Аватара пользователя
Shenochek

Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Shenochek »

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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение yurfed »

Цитата Shenochek:



почему она корректно не запускается, и что можно сделать, чтобы она всё-таки запустилась?
Assm - [решено] Помогите разобраться с программой на ассемблере




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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Shenochek »

Цитата yurfed:



А что пишет, как ругается. Операционная система под которой запускаете, какая?
Assm - [решено] Помогите разобраться с программой на ассемблере




yurfed, Операционная система Windows XP. При линковке пишет предупреждение Warning: No stack.

Программа собирается и при её запуске выводится куча невразумительных крякозябров.
Аватара пользователя
AMDBulldozer

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение AMDBulldozer »

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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Efir »

Цитата Shenochek:



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





Цитата Shenochek:



При линковке пишет предупреждение Warning: No stack.
Assm - [решено] Помогите разобраться с программой на ассемблере




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




Цитата Shenochek:



Tlink с ключами /x /3
Assm - [решено] Помогите разобраться с программой на ассемблере




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




Цитата Shenochek:



Операционная система Windows XP
Assm - [решено] Помогите разобраться с программой на ассемблере




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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Shenochek »

Цитата AMDBulldozer:



простите, а чем Вы её компилируете и какой формат исполняемого файла?
Assm - [решено] Помогите разобраться с программой на ассемблере




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


Цитата Efir:



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




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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Efir »

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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Shenochek »

Цитата Efir:



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




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


Цитата Efir:



Для компоновщика строка выглядеть должна как и показали.
Assm - [решено] Помогите разобраться с программой на ассемблере




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

Я заранее прошу прощения за свою назойливость, просто позарез надо разобраться с этой программой. А, так как в ассемблере я далеко не профи, то обращаюсь за помощью к более опытным форумчанам. Даже про то, что ассемблер com программы делает впервые от вас узнал. Век живи, век учись!
Аватара пользователя
Efir

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Efir »

Цитата Shenochek:



А, так как в ассемблере я далеко не профи, то обращаюсь за помощью к более опытным форумчанам
Assm - [решено] Помогите разобраться с программой на ассемблере




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




Цитата Shenochek:



Fatal: 32-bit record encountered in module C:\ASM\2.ASM
Assm - [решено] Помогите разобраться с программой на ассемблере




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

Re: Assm - [решено] Помогите разобраться с программой на ассемблере

Сообщение Shenochek »

Цитата Efir:



верните ключ /3. В код не глянул, там оперируют 32-х разрядными регистрами, а точнее 32-х разрядными типами.
Assm - [решено] Помогите разобраться с программой на ассемблере




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

Вернуться в «Программирование и базы данных»