Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование в Ассемблере / 25 сообщений из 30, страница 1 из 2
22.10.2012, 20:49
    #38008846
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
Здравствуйте!

Мне нужно решить на Ассемблере этот пример: (a+b-d)/(b-a)

Вот, что у меня получилось:

;Инструкции процессора Pentium
.586P

;Плоская модель памяти, соглашение о вызовах в стиле С
.MODEL FLAT,C

;Сегмент данных
DATA SEGMENT

PUBLIC a, b, d, res, ost ;переменные, доступные для внешних модулей

a DW ? ;Объявление переменных
b DW ?
d DW ?
res DW ?
ost DW ?
DATA ENDS

;Сегмент кода
CODE SEGMENT

PUBLIC mov_16 ;функция, доступная для внешних модулей

; (a+b-d)/(b-a)

mov_16 PROC ;определение функции
MOV AX, a ; AX = a
MOV BX, b ; BX = b
ADD AX, BX ; AX = AX + BX (a + b)

SUB AX, d ; AX=a+b-d

SUB BX, a ; BX=b-a
XOR DX, DX ; DX = 0
IDIV BX ;
MOV res, BX ;
MOV ost, AX ;
RET

mov_16 ENDP

CODE ENDS
END


Скажите, пожалуйста, допущены ли у меня ошибки?
...
Рейтинг: 0 / 0
22.10.2012, 20:51
    #38008847
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaСкажите, пожалуйста, допущены ли у меня ошибки?
А проверить не можете?
...
Рейтинг: 0 / 0
22.10.2012, 20:55
    #38008851
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
ShSerge, пришил файл .obj к C++. Программа запускается, а ответ не выводит.
...
Рейтинг: 0 / 0
22.10.2012, 21:44
    #38008886
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
А как вызываете mov_16 в коде программы?
...
Рейтинг: 0 / 0
22.10.2012, 23:03
    #38008969
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
AndreTMА как вызываете mov_16 в коде программы?

Через консольное приложение на C++. Код вот такой:
//Подключаем заголовочные файлы
#include "stdafx.h"
#include <conio.h>

//Объявляем внешние функции и переменные
extern "C" void mov_16(void);
extern "C" short int a, b, d, res, ost;

//Основная функция
void main()
{
printf("Enter a: ");
scanf("%d",&a);

printf("Enter b: ");
scanf("%d",&b);

printf("Enter d: ");
scanf("%d",&d);

mov_16();
printf("Assembler: ", res, ost);
getch();
}
...
Рейтинг: 0 / 0
22.10.2012, 23:23
    #38008989
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaЧерез консольное приложение на C++. Код вот такой:Во первых, С++ я там не вижу.
Во вторых, берем учебник и читаем про функцию printf().
...
Рейтинг: 0 / 0
22.10.2012, 23:27
    #38008995
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaa DW ? ;Объявление переменных
b DW ?
d DW ?
res DW ?
ost DW ?djmalinaextern "C" short int a, b, d, res, ost;
Не?
...
Рейтинг: 0 / 0
22.10.2012, 23:46
    #38009012
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
AndreTM, а что тогда, если не short int?
...
Рейтинг: 0 / 0
23.10.2012, 03:40
    #38009106
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
AndreTMdjmalinaa DW ? ;Объявление переменных
b DW ?
d DW ?
res DW ?
ost DW ?djmalinaextern "C" short int a, b, d, res, ost;
Не?Это как раз правильно. У него переменные объявлены как dw в асме - 2 байта то есть, а это и есть short int в С.
У него проблема в выводе, читайте учебник по printf()
...
Рейтинг: 0 / 0
23.10.2012, 04:39
    #38009116
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
White Owlпеременные объявлены как dw в асме - 2 байта то есть, а это и есть short int в С.
У него проблема в выводе, читайте учебник по printf()Согласен, конечно... Надо что-то вроде?
Код: sql
1.
printf("%S %u %u", "Assembler: ", res, ost);
...
Рейтинг: 0 / 0
23.10.2012, 09:14
    #38009228
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
AndreTM, Как конкретно нужно сделать вывод?
Пробовал Вашим вариантом, так тоже всё запускается, а ответ не выводит.
...
Рейтинг: 0 / 0
23.10.2012, 12:17
    #38009622
pirovindos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalina,

Новый код покажите, пожалуйста.
...
Рейтинг: 0 / 0
23.10.2012, 18:44
    #38010473
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
...
Рейтинг: 0 / 0
05.11.2012, 22:03
    #38026000
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
Как проверить переменную res на наличие в интервале -32768..32767 ?
...
Рейтинг: 0 / 0
05.11.2012, 22:17
    #38026015
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaКак проверить переменную res на наличие в интервале -32768..32767 ?
А это не нужно, она из этого диапазона уж никак не выпадет по определению.
...
Рейтинг: 0 / 0
05.11.2012, 22:26
    #38026025
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
XDiaBLodjmalinaКак проверить переменную res на наличие в интервале -32768..32767 ?
А это не нужно, она из этого диапазона уж никак не выпадет по определению.
Мне нужно в C++ данную переменную проверить на переполнение. Как?
...
Рейтинг: 0 / 0
05.11.2012, 22:27
    #38026026
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaXDiaBLoпропущено...

А это не нужно, она из этого диапазона уж никак не выпадет по определению.
Мне нужно в C++ данную переменную проверить на переполнение. Как?
Чудной вопрос, возможно неточно сформулирован, но пока я повторю, это бессмысленно.
...
Рейтинг: 0 / 0
05.11.2012, 22:34
    #38026030
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
Вот код программы на C++:

//Подключаем заголовочные файлы
#include "stdafx.h"
#include <conio.h>

//Объявляем внешние функции и переменные
extern "C" void mov_16(void);
__int64 aa, bb, dd;
extern "C" short int a, b, d, res, ost;

//Основная функция
void main()
// short int [-32768..32767]

{ printf("(a+b-d)/(b-a)\n");
printf("Enter a: ");
scanf("%I64d",&aa);

if (aa>32767 || aa<-32768) return;
else a=(short int)aa;

printf("Enter b: ");
scanf("%I64d",& bb);

if (bb>32767 || bb<-32768) return;
else b=(short int)bb;

printf("Enter d: ");
scanf("%I64d",& dd);

if (dd>32767 || dd<-32768) return;
else d=(short int)dd;

mov_16();
printf("Assembler_res: %d\n", res);
printf("Assembler_ost: %d\n", ost);
getch();

}

Переменные a, b и d я проверил. Но никак не пойму как res проверить.
...
Рейтинг: 0 / 0
05.11.2012, 22:43
    #38026039
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaВот код программы на C++:

//Подключаем заголовочные файлы
#include "stdafx.h"
#include <conio.h>

//Объявляем внешние функции и переменные
extern "C" void mov_16(void);
__int64 aa, bb, dd;
extern "C" short int a, b, d, res, ost;

//Основная функция
void main()
// short int [-32768..32767]

{ printf("(a+b-d)/(b-a)\n");
printf("Enter a: ");
scanf("%I64d",&aa);

if (aa>32767 || aa<-32768) return;
else a=(short int)aa;

printf("Enter b: ");
scanf("%I64d",& bb);

if (bb>32767 || bb<-32768) return;
else b=(short int)bb;

printf("Enter d: ");
scanf("%I64d",& dd);

if (dd>32767 || dd<-32768) return;
else d=(short int)dd;

mov_16();
printf("Assembler_res: %d\n", res);
printf("Assembler_ost: %d\n", ost);
getch();

}

Переменные a, b и d я проверил. Но никак не пойму как res проверить.
Погоди, я ошибся, рес ведь тоже DW, так точно также и проверяй.
...
Рейтинг: 0 / 0
05.11.2012, 22:47
    #38026041
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
Но вообще как-то странно, если нужно в этом диапазоне, то наверное просто нужно не DW использовать. Впрочем учебные задачки, всегда славились странностью задач.
...
Рейтинг: 0 / 0
05.11.2012, 22:49
    #38026045
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
XDiaBLo, т.е. нужно сделать вот так:



mov_16();
if (res1>32767 || res1<-32768) return;
else res=(short int)res1;
printf("Assembler_res: %d\n", res);
if (ost1>32767 || ost1<-32768) return;
else ost=(short int)ost1;
printf("Assembler_ost: %d\n", ost);
getch();
...
Рейтинг: 0 / 0
05.11.2012, 22:51
    #38026047
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
djmalinaXDiaBLo, т.е. нужно сделать вот так:


mov_16();
if (res1>32767 || res1<-32768) return;
else res=(short int)res1;
printf("Assembler_res: %d\n", res);
if (ost1>32767 || ost1<-32768) return;
else ost=(short int)ost1;
printf("Assembler_ost: %d\n", ost);
getch();

А попробовать что мешает? Я то уж лет 10 на ассемблере не пишу, а ты установи компилятор, и прекрати умозрительно программировать, и никаких проблем не будет.
...
Рейтинг: 0 / 0
05.11.2012, 22:55
    #38026049
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
XDiaBLo, мешает то, что я не знаю какие числа ввести, чтобы число не попало в данный диапазон. Ведь первоначальные числа я проверил.
...
Рейтинг: 0 / 0
05.11.2012, 23:46
    #38026069
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
Ну хоть иногда мозги включать же надо?!

djmalina,
У тебя в ассемблерном коде написано:
Код: plaintext
MOV res, BX
Спрашивается, каким образом res может содержать больше значащих бит чем 16-и битовый регистр???
...
Рейтинг: 0 / 0
06.11.2012, 00:11
    #38026083
djmalina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование в Ассемблере
White OwlНу хоть иногда мозги включать же надо?!

djmalina,
У тебя в ассемблерном коде написано:
Код: plaintext
MOV res, BX
Спрашивается, каким образом res может содержать больше значащих бит чем 16-и битовый регистр???
Насколько я понимаю, нужно сделать так:
1. В начале написать следующее в коде asm:
res1 DD ?
2. Затем уже в С++ сделать вот так:
mov_16();
if (res1>32767 || res1<-32768) return;
else res=(short int)res1;
printf("Assembler_res: %d\n", res);
if (ost1>32767 || ost1<-32768) return;
else ost=(short int)ost1;
printf("Assembler_ost: %d\n", ost);
getch();

Так должно работать?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование в Ассемблере / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]