| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Что за ошибка? |
| Автор: Tamplier 1.5.2007, 10:30 |
| Подскажите, что за ошибка и как с её исправить: Invalid register combination (e.g [BP+BX]) in function main |
| Автор: anwe 1.5.2007, 11:25 |
| Адресация со смещением из 16-разрядных регистров можно только bx+si, bx+di, bp+si, bp+di |
| Автор: Tamplier 1.5.2007, 13:03 |
| Ещё один вопрос: в одном из самоучителей по ассемблеру прочитал, что команда loop работает только на ближенм расстоянии. Не подскажете поконкретнее: ближнее расстояние - это сколько строк? |
| Автор: anwe 1.5.2007, 13:09 |
| 127 байт |
| Автор: Tamplier 1.5.2007, 15:27 |
| Так и не разобрался с циклом. Программа должна выбирать из массива размерностью n наибольшее число, которое меньше 20. Вот код. Почему-то цикл не работает, то есть он просто не оканчивается. #include <stdio.h> main() { int n,i,y,q; printf("\n\n vvedite rasmernost' n="); scanf("%d",&n); printf("Vvedite chisla\n"); scanf("%d",&y); asm{ mov ax,y } asm{ mov cx,n } reperat: asm{ jmp o1 } o2: asm{ loop reperat jmp e } o1: scanf("%d",&i); asm{ mov bx,i cmp bx,ax ja m1 jb m3 } m1: asm{ cmp bx,20 jb m2 ja m3 } m2: asm{ mov ax,bx jmp m3 } m3: asm{ jmp o2 } e: asm{ mov q,ax } printf ("\n max=%d", q); } |
| Автор: JAPH 1.5.2007, 17:00 |
| Может, scanf изменяет CX? |
| Автор: anwe 1.5.2007, 21:29 |
| scanf наверное, считывает? Я не знаю какой API она соответствует, но функции Win32 не сохраняют значения в eax, ecx и edx после их выполнения. Вот и ошибка. |