powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование в Ассемблере
30 сообщений из 30, показаны все 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
Программирование в Ассемблере
    #38026099
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalinaWhite OwlНу хоть иногда мозги включать же надо?!

djmalina,
У тебя в ассемблерном коде написано:
Код: plaintext
MOV res, BX
Спрашивается, каким образом res может содержать больше значащих бит чем 16-и битовый регистр???
Насколько я понимаю, нужно сделать так:
1. В начале написать следующее в коде asm:
res1 DD ?Зачем? Ты можешь логически обосновать зачем ты это делаешь?

djmalina2. Затем уже в С++ сделать вот так:
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();Еще раз спрашиваю: зачем?

djmalinaТак должно работать?Кому должно?
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38026155
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНу хоть иногда мозги включать же надо?!

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

djmalina,
У тебя в ассемблерном коде написано:
Код: plaintext
MOV res, BX
Спрашивается, каким образом res может содержать больше значащих бит чем 16-и битовый регистр???
Точно, какой-то я невнимательный :)
В начале написать следующее в коде asm:
res1 DD ? И вот таким образом res может содержать больше значащих бит чем 16-и битовый регистр.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38026328
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там как бы в исходном посте не понятно как переменные a,b, d получают свои значения и непонятно как функция возвращает результат.

MSDNAll arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register, except for 8-byte structures, which are returned in the EDX:EAX register pair. Larger structures are returned in the EAX register as pointers to hidden return structures. Parameters are pushed onto the stack from right to left. Structures that are not PODs will not be returned in registers.

The compiler generates prolog and epilog code to save and restore the ESI, EDI, EBX, and EBP registers, if they are used in the function.
...
Рейтинг: 0 / 0
Программирование в Ассемблере
    #38043323
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена, тему можно закрыть.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование в Ассемблере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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