Через раз работает условный переход в ассемблере
Условие: если, (х1 + х4)%3 == х3, то х2 = 5, иначе х3, х4 = х4, х3 При некоторых вводных, условие исполняется верно(например 1 0 1 3 или 1 3 2 4), а при других исполняется ветка иначе (1 0 2 1 или 1 2 1 1 или 1 0 0 5). Не понимаю в чем именно ошибка
#include <stdio.h>
#include <locale.h>
#include <ctype.h>
int main()
{
setlocale(LC_ALL, "rus");
char x1, x2, x3, x4, y1, y2, y3, y4;
printf("Введите набор значений x1, x2, x3, x4\n");
scanf("%c %c %c %c", &x1, &x2, &x3, &x4);
//printf("%c %c %c %c", y1, y2, y3, y4);
if ((isdigit(x1)) && (isdigit(x2)) && (isdigit(x3)) && (isdigit(x4)))
{
asm (
".intel_syntax noprefix;"
"mov al, %7 ;"//переносим из x4
"mov %3, al ;"// в y4
"mov al, %6 ;"//переносим из х3
"mov %2, al ;"//в у3
"mov al, %5 ;"//переносим из х2
"mov %1, al ;"//в у2
"mov al, %4 ;"//переносим из х1
"mov %0, al ;"//в у1
"mov cl, %7 ;"//сохраняем в ah x4
"mov al, %4 ;"// а в al первый
"add al, cl ;"
"cbw ;"
"mov bl, '3' ;"
"div bl ;"
"mov cl, ah ;"
"cmp cl, %6 ;"//сравниваем их
"jz ELSE ;"//если == остаток, то переходим на ELSE
"mov al, %6 ;"
"mov cl, %7 ;"
"mov %3, al ;"
"mov %2, cl ;"
"jmp EXIT ;" //безусловный переход на выход
"ELSE: ;"
"mov %1, '5' ;"
"jmp EXIT ;"
"EXIT : ;"
".att_syntax ;"
:"=&r"(y1), "=&r"(y2), "=&r"(y3), "=&r"(y4)
:"r"(x1), "r"(x2), "r" (x3), "r" (x4)
: "ax", "bx", "cx", "dx"
);
printf("полученная строка\n");
printf("%c %c %c %c", y1, y2, y3, y4);
return 0;
}
else {printf("Error\n");}
}
Ответы (1 шт):
Автор решения: newman
→ Ссылка
Вот эта строка вызывает сомнение.
"mov bl, '3' ;"
С ассемблером я давно работал, но все же мне кажется, что здесь в регистр bl заносится не число 3, а символ '3' - а по факту код этого символа.