Консультация № 186308
03.06.2012, 13:26
100.01 руб.
04.06.2012, 02:13
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
У меня есть чуть неверно написанная программа для Tasm .386 . Помогите, пожалуйста, исправить ошибки.
Решаемое выражение: (a^3-b^2)/c^2

[code h=200];y=(a^3 - b^2)/c^2

.model small
.stack 100h
.data

a db ?
b db ?
c db ?

.code
start:
mov ax,@data
mov ds,ax

mov al,b
cbw
mov bx,ax
imul bx
mov bx,ax
mov al,c
cbw
cwd

mov ecx,eax
imul ecx
mov ecx,eax
mov al,a
cbw
cwd
mov eax,ecx
imul eax
imul eax
mov eax,ecx

sub ax,bx
cwd
cdq
idiv ecx

mov ax,4c00h
int 21h

end start[/code]

Обсуждение

давно
Посетитель
7438
7205
04.06.2012, 02:08
общий
это ответ
Здравствуйте, Посетитель - 341182!
Предлагаю Вам Вашу программу с исправлениями
и свой вариант программы...
[code h=200];y=(a^3 - b^2)/c^2

.model small
.stack 100h
.data

a db 15 ; !!!надо задать конкретные значения
b db 7
c db 3

.386 ; !!!указываем, что используются возможности 386 процессора
.code
start:
mov ax,@data
mov ds,ax

mov al,b ;al = b
cbw ;ax = b
mov bx,ax ;bx = b
imul bx ;dx:ax = b^2
cwde ;eax = b^2 !!!сразу перейдем к 32-битному регистру
; mov bx,ax ;bx = b^2
mov ebx, eax ;ebx = b^2

mov al,c ;al = c
cbw ;ax = c
; cwd ;dx:ax = c !!!надо cwde, тогда eax = c
cwde ;eax = c !!!

mov ecx,eax ;ecx = c !!!при cwd старшее слово eax - неопределено
imul ecx ;edx:eax = c^2
mov ecx,eax ;ecx = c^2

mov al,a ;al = a
cbw ;ax = a
; cwd ;dx:ax = a !!!надо cwde, тогда eax = c
cwde ;eax = a !!!
; mov eax,ecx ; !!!убрать! затирается а
mov edi, eax ; !!!надо сохранить
imul eax ;eax = a^2
; imul eax ;eax = a^4 !!!а надо a^3
imul eax, edi ;eax = a^3
; mov eax,ecx ; !!!убрать! затирается а^3

; sub ax,bx ;ax = a^3 - b^2 !!!лучше ранее сразу сохранять в ebx
; cwd ;dx:ax = b^2 !!!надо cwde, тогда eax = b^2
sub eax, ebx ;eax = a^3-b^2 !!!лучше так
cdq ;edx:eax = a^3-b^2
idiv ecx ;eax = edx:eax / ecx

mov ax,4c00h
int 21h

end start[/code]
Можно было написать, например, так:
[code h=200];y=(a^3 - b^2)/c^2

.model small
.stack 100h
.data

a db 15
b db 7
c db 3

.386
.code
start:
mov ax,@data
mov ds,ax

movsx eax, c
imul eax, eax
mov ecx, eax

movsx eax, b
imul eax, eax
mov ebx, eax

movsx eax, a
mov edi, eax
imul eax, edi
imul eax, edi

sub eax, ebx
cdq
idiv ecx

mov ax,4c00h
int 21h

end start[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа