|
|
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
djmalinaWhite OwlНу хоть иногда мозги включать же надо?! djmalina, У тебя в ассемблерном коде написано: Код: plaintext Насколько я понимаю, нужно сделать так: 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Так должно работать?Кому должно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2012, 00:52 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
White OwlНу хоть иногда мозги включать же надо?! djmalina, У тебя в ассемблерном коде написано: Код: plaintext Точно, какой-то я невнимательный :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2012, 06:48 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
XDiaBLoWhite OwlНу хоть иногда мозги включать же надо?! djmalina, У тебя в ассемблерном коде написано: Код: plaintext Точно, какой-то я невнимательный :) В начале написать следующее в коде asm: res1 DD ? И вот таким образом res может содержать больше значащих бит чем 16-и битовый регистр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2012, 08:52 |
|
||
|
Программирование в Ассемблере
|
|||
|---|---|---|---|
|
#18+
Там как бы в исходном посте не понятно как переменные 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2012, 10:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1342043]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
144ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 411ms |

| 0 / 0 |
