Size: a a a

Ассемблер

2020 December 22

DR

Dima Richev in Ассемблер
Перепроверь код
источник

O

Oleksii 🌈 in Ассемблер
Dima Richev
Перепроверь код
okay
источник

O

Oleksii 🌈 in Ассемблер
Dima Richev
Где-то неправильно обратился к памяти - ACCESS_VIOLATION
странно
источник

O

Oleksii 🌈 in Ассемблер
на 8 бит точно такой же код работает, на 16 просто поменял регистры и уже нет
источник

DR

Dima Richev in Ассемблер
покажи код
источник

O

Oleksii 🌈 in Ассемблер
секунду
источник

O

Oleksii 🌈 in Ассемблер
#include <iostream>
#include <stdio.h>
#include <cstdlib>
int main()
{
   signed short int a, b, c, d, e, f, res_c, res_asm, res_asm1, res_asm2;
   printf("(4*c-d/2+23-e)/(b+a*a-1+f)\n");
   printf("Enter the values of the range [-32768...32767]\n");
   printf("a = "); scanf_s("%d", &a);
   printf("b = "); scanf_s("%d", &b);
   printf("c = "); scanf_s("%d", &c);
   printf("d = "); scanf_s("%d", &d);
   printf("e = "); scanf_s("%d", &e);
   printf("f = "); scanf_s("%d", &f);
   res_c = (4 * c - d / 2 + 23 - e) / (b + a * a - 1 + f);
   printf("Result C = %d\n", res_c);

   __asm
   {
       // (4*c-d/2+23-e)/(b+a*a-1+f)
       mov  ax, 4; // <al> = 4
       cwd;
       mov bx, c; // <bl> = c
       imul bx; // <bl> = 4*c
       mov bx, 1; // <bl> = 1
       idiv bx; // <al> = 4*c
       mov bx, ax; // <bl> = 4*c
       mov ax, d; // <al> = d
       cwd; //<ax> = d
       mov dx, 2; // <dl> = 2
       idiv dx; // <al> = d/2
       mov dx, ax; // <dl> = d/2
       sub bx, dx; // <bl> = 4*c-d/2
       add bx, 23; // <bl> = 4*c-d/2+23
       sub bx, e;  // <bl> = 4*c-d/2+23-e

       mov ax, a; // <al> = a
       cwd; // <ax> = a
       imul a; // <al> = a*a
       mov cx, b; // <cl> = b
       add cx, ax; // <cl> = b+a*a
       dec cx; // <cl> = b+a*a-1
       add cx, f; // <cl> = b+a*a-1+f

       mov ax, bx;
       idiv cx; // <bl> = (4*c-d/2+23-e)/(b+a*a-1+f)
       mov res_asm, ax; // <res_asm> = (4*c-d/2+23-e)/(b+a*a-1+f)
   }
   printf("Result ASM = %d\n", res_asm);
   printf("\n");
   system("Pause");
   return 0;
}
источник

O

Oleksii 🌈 in Ассемблер
Oleksii 🌈
#include <iostream>
#include <stdio.h>
#include <cstdlib>
int main()
{
   signed short int a, b, c, d, e, f, res_c, res_asm, res_asm1, res_asm2;
   printf("(4*c-d/2+23-e)/(b+a*a-1+f)\n");
   printf("Enter the values of the range [-32768...32767]\n");
   printf("a = "); scanf_s("%d", &a);
   printf("b = "); scanf_s("%d", &b);
   printf("c = "); scanf_s("%d", &c);
   printf("d = "); scanf_s("%d", &d);
   printf("e = "); scanf_s("%d", &e);
   printf("f = "); scanf_s("%d", &f);
   res_c = (4 * c - d / 2 + 23 - e) / (b + a * a - 1 + f);
   printf("Result C = %d\n", res_c);

   __asm
   {
       // (4*c-d/2+23-e)/(b+a*a-1+f)
       mov  ax, 4; // <al> = 4
       cwd;
       mov bx, c; // <bl> = c
       imul bx; // <bl> = 4*c
       mov bx, 1; // <bl> = 1
       idiv bx; // <al> = 4*c
       mov bx, ax; // <bl> = 4*c
       mov ax, d; // <al> = d
       cwd; //<ax> = d
       mov dx, 2; // <dl> = 2
       idiv dx; // <al> = d/2
       mov dx, ax; // <dl> = d/2
       sub bx, dx; // <bl> = 4*c-d/2
       add bx, 23; // <bl> = 4*c-d/2+23
       sub bx, e;  // <bl> = 4*c-d/2+23-e

       mov ax, a; // <al> = a
       cwd; // <ax> = a
       imul a; // <al> = a*a
       mov cx, b; // <cl> = b
       add cx, ax; // <cl> = b+a*a
       dec cx; // <cl> = b+a*a-1
       add cx, f; // <cl> = b+a*a-1+f

       mov ax, bx;
       idiv cx; // <bl> = (4*c-d/2+23-e)/(b+a*a-1+f)
       mov res_asm, ax; // <res_asm> = (4*c-d/2+23-e)/(b+a*a-1+f)
   }
   printf("Result ASM = %d\n", res_asm);
   printf("\n");
   system("Pause");
   return 0;
}
комментарии не поменчл только
источник

O

Oleksii 🌈 in Ассемблер
да
источник

O

Oleksii 🌈 in Ассемблер
я прибавляю
источник

O

Oleksii 🌈 in Ассемблер
к сх значение f
источник

O

Oleksii 🌈 in Ассемблер
может в переменную записать числитель 🤔
источник

O

Oleksii 🌈 in Ассемблер
хотя я пробовал результаты выводить в самом начале ассемблерного кода. После первых операций.
не пашет
источник

s

s54816 in Ассемблер
Dima Richev
Где-то неправильно обратился к памяти - ACCESS_VIOLATION
Там не AV. idiv dx делит dx:ax на dx. Стоит положить делитель в другой регистр, а dx обнулить. Ну или делить на dl, тогда всё ок будет.
источник

O

Oleksii 🌈 in Ассемблер
не, незя надо с dx
источник

s

s54816 in Ассемблер
Oleksii 🌈
не, незя надо с dx
Почему вдруг? У тебя делимое в ax,  делитель тоже отлично в 8 бит влезает, зачем тебе 32 бита на 16 делить?
источник

O

Oleksii 🌈 in Ассемблер
согласен
источник

O

Oleksii 🌈 in Ассемблер
тоисть мне убрат cwd с ах
источник

s

s54816 in Ассемблер
Oleksii 🌈
тоисть мне убрат cwd с ах
idiv dl.
источник

O

Oleksii 🌈 in Ассемблер
s54816
idiv dl.
вна2ре
источник