powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование в Ассемблере
25 сообщений из 30, страница 1 из 2
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #38008847
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalinaСкажите, пожалуйста, допущены ли у меня ошибки?
А проверить не можете?
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38008851
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge, пришил файл .obj к C++. Программа запускается, а ответ не выводит.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38008886
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вызываете mov_16 в коде программы?
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #38008989
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalinaЧерез консольное приложение на C++. Код вот такой:Во первых, С++ я там не вижу.
Во вторых, берем учебник и читаем про функцию printf().
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38008995
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalinaa DW ? ;Объявление переменных
b DW ?
d DW ?
res DW ?
ost DW ?djmalinaextern "C" short int a, b, d, res, ost;
Не?
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38009012
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, а что тогда, если не short int?
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #38009116
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlпеременные объявлены как dw в асме - 2 байта то есть, а это и есть short int в С.
У него проблема в выводе, читайте учебник по printf()Согласен, конечно... Надо что-то вроде?
Код: sql
1.
printf("%S %u %u", "Assembler: ", res, ost);
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38009228
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, Как конкретно нужно сделать вывод?
Пробовал Вашим вариантом, так тоже всё запускается, а ответ не выводит.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38009622
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalina,

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

А это не нужно, она из этого диапазона уж никак не выпадет по определению.
Мне нужно в C++ данную переменную проверить на переполнение. Как?
Чудной вопрос, возможно неточно сформулирован, но пока я повторю, это бессмысленно.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #38026041
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вообще как-то странно, если нужно в этом диапазоне, то наверное просто нужно не DW использовать. Впрочем учебные задачки, всегда славились странностью задач.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #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
Программирование в Ассемблере
    #38026049
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XDiaBLo, мешает то, что я не знаю какие числа ввести, чтобы число не попало в данный диапазон. Ведь первоначальные числа я проверил.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38026069
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хоть иногда мозги включать же надо?!

djmalina,
У тебя в ассемблерном коде написано:
Код: plaintext
MOV res, BX
Спрашивается, каким образом res может содержать больше значащих бит чем 16-и битовый регистр???
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #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]