//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <iostream>
using namespace std;
int s =6;
extern "C"
{
int pluse();
};
int main(int argc, char* argv[])
{
int y=pluse();
cout << y;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
FFFFFFFF
Создалась следущяя проблема,а проблема в следующем.
Компилирую и запускаю след. код :
C++
Код:
Assembler
Код:
title pluse
.386
.model large,C
.data
extrn s:DWORD
.code
public c pluse
pluse proc far
mov eax,2
add s,2
mov eax,s
pluse endp
end
.386
.model large,C
.data
extrn s:DWORD
.code
public c pluse
pluse proc far
mov eax,2
add s,2
mov eax,s
pluse endp
end
Очень странно,ведь я не написал в процедуре асемблеровского кода команду возврата значения (ret).Компилируется,возвращяет значения из регистра eax.Всё в норме!
Пытаюсь вставить ret,компилирует,выдаёт ошибку,ссылается на адрес конца файла (FFFFFFF)
Подозреваю в этом регистр CS.Хотя не знаю,поэтому и спрашиваю.В чём же ошибка?Помогите плизз!!!!!
ret - это команда вернуться из процедуры, никаких значений она не возвращает.
В данном случае она не нужна т.к на endp также происходит выход из процедуры.
спасибо огромное!!!!всё встало во свои места.попутный вопрос,регистр еах может содержать тип float?Если нет,то как это можно организовать,чтоб на выводе был вещественный тип?Просто раньше я программировал на с++,сейчас сел за asm ,появился предмет Архитектура компьютеров в ВУЗ'е.Вот,делаю лабы.....
ну тут нужно определить extrn (имя переменной):dword
затем результирующие записать в эту переменную....
но функ-я idiv такая муторная....будем разбираться =)
EAX - это просто 32 бита. Но некоторые машинные команды воспринимают их как целое число, а некоторые - как вещественное.
Если в программе на Си будет написано float pluse(), то Си те же биты будет воспринимать как вещественное число.
Аха!!!!как я посмотрел idiv комманда записывает в региcтры eax частное и edx,тока как их поместить в переменную типа DWORD???
DWORD - 4 байта (EAX)
WORD - 2 байта (AX - половина EAX)
BYTE - 1 байт (AH и AL - половинки AX)
mov s, eax как раз поместит DWORD из EAX в s
int x; x < eax
int y; y < edx
cout << x << "." << y;
после использования вун-ии idiv
дел в том,что мне в лабараторке дана функция (-2 * с + d * 82)/(a / 4 - 1),вот я её реализую ,все вычисления по сути дела должен заниматся asm модуль.Начал потихонечку тестить комманды,напаролся на мелкие проблемы...
вроде потихонечку получается!!!!!!!СПАСИБО ВАМ ПРИБОЛЬШОЕЕЕЕЕ!!!!!Вы мне оказали очень большую услугу в начинании освоения столь непростого языка программирования!!!!!
Наверное вам нужно это:
http://osinavi.ru/asm/FPUexpansion/2.html
http://osinavi.ru/asm/FPUexpansion/3.php
нужно будет написать что-то вроде
Код:
fild 17
fild 2
fdiv
fstp eax
fild 2
fdiv
fstp eax
P.S не надо писать много сообщений по одной строчке - лучше используйте кнопку "редактировать" снизу