Ошибки в ассемблерной вставке - C (СИ)
Формулировка задачи:
в 24 и 25 строке ругается, что недопустимое число операторов
#include "iostream"
#include "windows.h"
#include "stdlib.h"
#include <stdio.h>
/*На промежутке от 1 до 100 000
Подсчитать количество таких чисел X, что (Х+X-2) - делится на 3 без остатка*/
int main()
{
short int x=0,ko=0;
int k = 0, l = 0;
_asm
{
mov di,3
mov si,2
mov cx, 100000
t1:
mov bx, cx
mov cx, 100000
t2:
mov ax,cx
add bx
sub si
div di
cmp dx, 1
jne m1
inc ko
cmp ko, 200
je m2
m1 :
loop t2
mov cx, bx
loop t1
jmp e
m2 :
mov x, bx
je m1
e :
}
for (int i=0; i<=100000;i++)
{
if ((i+i-2)%3==0)
{
k++;
if (k == 200)
{
l = i;
}
};
}
printf("Proverka na C++:\n");
printf("k=%d\n",k);
if (k < 200) printf("Chisel menshe dvuhsot");
else printf("Dvuhsotoe chislo=%d\n", l);
system("pause");
return 0;
}Решение задачи: «Ошибки в ассемблерной вставке»
textual
Листинг программы
mov ax,cx add ax,bx sub ax,si div di cmp ax, 1
Объяснение кода листинга программы
mov ax,cx- Перемещение значения регистра cx в регистр axadd ax,bx- Добавление значения регистра bx к значению регистра axsub ax,si- Вычитание значения регистра si из значения регистра axdiv di- Деление значения регистра ax на значение регистра dicmp ax, 1- Сравнение значения регистра ax с 1 Данный код выполняет последовательность операций над регистрами процессора, где ax используется как промежуточный регистр для выполнения операций сложения, вычитания и деления, а cx, bx и di используются как исходные и конечные значения для этих операций. Регистр si, по-видимому, используется как временная переменная в операции вычитания, а регистра dx в коде нет. Также в коде отсутствует какая-либо обработка ошибок или контроль за состоянием флагов регистра flags, что может привести к неопределенному поведению при делении на ноль или при выполнении операции вычитания с отрицательным значением.