Святослав Ясновидец
Гуру
(3633)
10 часов назад
#include <stdio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
short int y, v, v_c, v_as;
char x, z;
int i;
printf("Введите номер теста: \n");
scanf_s("%d", &i);
switch (i) {
case 1:
x = -0x4;
y = -0x3;
z = 0x2;
v = 0x12;
break;
case 2:
x = 0x7F;
y = -0x15AC;
z = 0x5F;
v = -0xA;
break;
}
v_c = (((3 + x) * z - 7 * y) / (y + 4)) - 1;
__asm {
; Вычисление (3 + x) * z (32 бита)
mov al, x
cbw ; AX = x (16 бит)
add ax, 3 ; AX = 3 + x
mov bx, ax ; BX = (3 + x)
mov al, z
cbw ; AX = z (16 бит)
imul bx ; DX:AX = (3+x)*z
mov si, dx ; Сохраняем старшую часть
mov di, ax ; Сохраняем младшую часть
; Вычисление 7*y (32 бита)
mov ax, y
cwd ; DX:AX = y (32 бита)
mov bx, 7
imul bx ; DX:AX = y * 7
; Вычитаем 7*y из (3+x)*z: (SI:DI) - (DX:AX)
sub di, ax
sbb si, dx ; SI:DI = числитель
; Знаменатель y + 4
mov ax, y
add ax, 4 ; AX = y + 4
mov cx, ax ; CX = знаменатель
; Деление SI:DI на CX
mov ax, di ; Младшая часть в AX
mov dx, si ; Старшая часть в DX
idiv cx ; AX = частное, DX = остаток
; Вычитаем 1
dec ax
mov v_as, ax
}
printf("Результат на ассемблере: \n %d(10) или %hx(16)\n", v_as, v_as);
printf("Результат на Си: \n %d(10) или %hx(16)\n", v_c, v_c);
printf("Заданные значения v = %d или %hx\n", v, v);
}
#include <stdio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
short int y, v, v_c, v_as;
char x, z;
int i;
printf("Введите номер теста: \n");
scanf_s("%d", &i);
switch (i) {
case 1:
x = -0x4;
y = -0x3;
z = 0x2;
v = 0x12;
break;
case 2:
x = 0x7F;
y = -0x15AC;
z = 0x5F;
v = -0xA;
break;
}
v_c = (((3 + x) * z - 7 * y) / (y + 4)) - 1;
__asm {
; Вычисление числителя((3 + x) * z - 7 * y)
mov al, x; Расширение со знаком x до 16 бит в AX
cbw;
add ax, 3; x + 3
mov bl, z;
imul bl; z * (x + 3)
mov bx, ax; Сохраняем результат в BX
; Расширение со знаком y до 16 бит
mov ax, y;
imul ax, 7; 7 * y
sub bx, ax; ((3 + x) * z - 7 * y)
; Вычисление знаменателя(y + 4)
mov ax, y; Расширение со знаком y до 16 бит в AX
add ax, 4; y + 4
mov cx, ax;
mov ax, bx;
cwd; Расширение из AX в DX
; Деление числителя на знаменатель
idiv cx; Деление числителя на знаменатель
; Вычитание 1 из результата
dec ax; -1
mov v_as, ax; Сохранение результата в v_as
}
printf("Результат на ассемблере: \n %d(10-я система) или %hx(16-я система)\n", v_as, v_as);
printf("Результат на Си: \n %d(10-я система) или %hx(16-я система)\n", v_c, v_c);
printf("Заданные значения v = %d или %hx\n", v, v);
}
мне нельзя использовать movsx и 32-битные регистры
Помогите пожалуйста!!!