|
|
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Мне нужно решить на Ассемблере этот пример: (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 Скажите, пожалуйста, допущены ли у меня ошибки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 20:49 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaСкажите, пожалуйста, допущены ли у меня ошибки? А проверить не можете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 20:51 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
ShSerge, пришил файл .obj к C++. Программа запускается, а ответ не выводит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 20:55 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
А как вызываете mov_16 в коде программы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 21:44 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
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(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 23:03 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaЧерез консольное приложение на C++. Код вот такой:Во первых, С++ я там не вижу. Во вторых, берем учебник и читаем про функцию printf(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 23:23 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaa DW ? ;Объявление переменных b DW ? d DW ? res DW ? ost DW ?djmalinaextern "C" short int a, b, d, res, ost; Не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 23:27 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
AndreTM, а что тогда, если не short int? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2012, 23:46 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
AndreTMdjmalinaa DW ? ;Объявление переменных b DW ? d DW ? res DW ? ost DW ?djmalinaextern "C" short int a, b, d, res, ost; Не?Это как раз правильно. У него переменные объявлены как dw в асме - 2 байта то есть, а это и есть short int в С. У него проблема в выводе, читайте учебник по printf() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 03:40 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
White Owlпеременные объявлены как dw в асме - 2 байта то есть, а это и есть short int в С. У него проблема в выводе, читайте учебник по printf()Согласен, конечно... Надо что-то вроде? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 04:39 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
AndreTM, Как конкретно нужно сделать вывод? Пробовал Вашим вариантом, так тоже всё запускается, а ответ не выводит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 09:14 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalina, Новый код покажите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 12:17 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Как проверить переменную res на наличие в интервале -32768..32767 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:03 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaКак проверить переменную res на наличие в интервале -32768..32767 ? А это не нужно, она из этого диапазона уж никак не выпадет по определению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:17 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
XDiaBLodjmalinaКак проверить переменную res на наличие в интервале -32768..32767 ? А это не нужно, она из этого диапазона уж никак не выпадет по определению. Мне нужно в C++ данную переменную проверить на переполнение. Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:26 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaXDiaBLoпропущено... А это не нужно, она из этого диапазона уж никак не выпадет по определению. Мне нужно в C++ данную переменную проверить на переполнение. Как? Чудной вопрос, возможно неточно сформулирован, но пока я повторю, это бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:27 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Вот код программы на 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 проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:34 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
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, так точно также и проверяй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:43 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Но вообще как-то странно, если нужно в этом диапазоне, то наверное просто нужно не DW использовать. Впрочем учебные задачки, всегда славились странностью задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:47 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:49 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
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 на ассемблере не пишу, а ты установи компилятор, и прекрати умозрительно программировать, и никаких проблем не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:51 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
XDiaBLo, мешает то, что я не знаю какие числа ввести, чтобы число не попало в данный диапазон. Ведь первоначальные числа я проверил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 22:55 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Ну хоть иногда мозги включать же надо?! djmalina, У тебя в ассемблерном коде написано: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2012, 23:46 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
White OwlНу хоть иногда мозги включать же надо?! djmalina, У тебя в ассемблерном коде написано: Код: plaintext Насколько я понимаю, нужно сделать так: 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(); Так должно работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2012, 00:11 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38009012&tid=1342043]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 425ms |

| 0 / 0 |
