Дано: A (integer); B (byte); C (smallint);
Вычислить: D = (A/B)*C; E = (C^2/B)-A
Первую формулу без проблем посчитал:
var
a,D,E,sss:Integer;
b:Byte;
c:SmallInt;
temp:Byte;
asm
mov ax, word ptr a
mov dx, word ptr a[2]
mov cl, b
mov ch, 0
div cx
mul c
mov word ptr D, ax
mov word ptr D[2], dx
Собственно как посчитать вторую а именно ()-А:
mov ax, c
mul c
mov cl, b
mov ch, 0
div cx
mov word prt sss, ax
end;
Подскажите пожалуйста
оп1 - 2байта - 16 бит
оп2 - 4байта - 32 бита
как из оп1 отнять оп2???
Другие языки программирования и технологии
Assembler лаба не могу разобраться
Не вижу здесь Ассемблер, вижу Паскаль со встроенным ассемблером, а это не одно и то же.
32-разрядный Integer, Smallint... -это явно не Turbo Pascal, это или Delphi, или Free Pascal, т. е. 32-разрядные диалекты Паскаля.
Тогда не понятно, почему вы используете 16-разрядные регистры?
Integer и Smallint - целые типы со знаком, а вы используете беззнаковые операции умножения и деления.
Первую формулу я бы реализовала так:
asm
mov eax, a
cdq
movzx ecx, b
idiv ecx
movsx ecx, c
imul ecx
mov D, eax
end;
А вторую так:
asm
movsx eax, c
imul eax
movzx ecx, b
div ecx //Здесь уже можно использовать беззнаковое деление, т. к. c^2 неотрицательное число
sub eax, a //Результат предыдущего деления уже 32-разрядный
mov E, eax
end;
Но если вам требуется использовать команды процессора i8086 (16-разрядного) , то это можно сделать так:
asm
mov ax, C
imul ax
mov cl, B
xor ch, ch
div cx
cwd //Расширение 16-разрядного операнда в ax до 32-разрядного в dx:ax
sub ax, word ptr A
mov word ptr E, ax
sbb dx, word ptr A[2]
mov word ptr E[2], dx
end;
В последнем случае возможно возбуждение исключения по ошибке деления при определённых сочетаниях значений C и B, когда результат вычисления C^2/B получается больше 65535 и целиком не умещается в регистр ax (переполнение частного).
32-разрядный Integer, Smallint... -это явно не Turbo Pascal, это или Delphi, или Free Pascal, т. е. 32-разрядные диалекты Паскаля.
Тогда не понятно, почему вы используете 16-разрядные регистры?
Integer и Smallint - целые типы со знаком, а вы используете беззнаковые операции умножения и деления.
Первую формулу я бы реализовала так:
asm
mov eax, a
cdq
movzx ecx, b
idiv ecx
movsx ecx, c
imul ecx
mov D, eax
end;
А вторую так:
asm
movsx eax, c
imul eax
movzx ecx, b
div ecx //Здесь уже можно использовать беззнаковое деление, т. к. c^2 неотрицательное число
sub eax, a //Результат предыдущего деления уже 32-разрядный
mov E, eax
end;
Но если вам требуется использовать команды процессора i8086 (16-разрядного) , то это можно сделать так:
asm
mov ax, C
imul ax
mov cl, B
xor ch, ch
div cx
cwd //Расширение 16-разрядного операнда в ax до 32-разрядного в dx:ax
sub ax, word ptr A
mov word ptr E, ax
sbb dx, word ptr A[2]
mov word ptr E[2], dx
end;
В последнем случае возможно возбуждение исключения по ошибке деления при определённых сочетаниях значений C и B, когда результат вычисления C^2/B получается больше 65535 и целиком не умещается в регистр ax (переполнение частного).
Динис Акмалов
Тоже подумала Паскаль вот и не читает
Похожие вопросы
- Помогите!Что то я в своём компе сделала и теперь не могу разобраться(((
- Не могу разобраться с Паскалем) Помогите
- Не могу разобраться с VBA Excel 2003 как копировать содер жимое одной ячейки в другую
- Не могу разобраться в БИОС
- Помогите, пожалуйста! Никак не могу разобраться с этой проблемой уже который год.
- Задачка по нахождению суммы цифр числа на языке Си... Не могу разобраться с функциями Div и Fmod...
- в командной строке не могу разобраться с командами: md, copy, ren, del...то есть для того чтобы совершить какое то
- Вопрос по паскалю.. не могу разобраться в выражении? условие внутри
- Помогите с формулой Microsoft Excel. Не могу разобраться с функцией ЕСЛИ
- Не могу разобраться в чём проблема в pascal