Top.Mail.Ru
Ответы

Программирование на ассемблер

Здравствуйте! Решаю следующую задачу: Вернуть 1, если числа являются сторонами треугольника Пифагора, иначе вернуть 0. При этом, задачу нужно выполнить используя подпрограмму; входные данные передаются в подпрограмму через стек, а результат возвращается через регистр AL. Я написала код (прикреплен ниже), но с командой ret он почему-то не работает (зацикливается). Что не так, понять никак не могу. Без ret работает, но это, как я понимаю, всё равно неправильно в случае работы с подпрограммой. Помогите, пожалуйста, разобраться в чём проблема! Работаю в программе emu8086.

Код:

data segment
x1 db 5
x2 db 4
x3 db 2
ends

stack segment
dw 128 dup(0)
ends

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

mov al, x1
cbw
mov bh, 0
mov ch, 0
mov bl, x2
mov cl, x3
push ax
push bx
push cx

call Pifagor
ends


Pifagor PROC NEAR
push bp
mov bp, sp

mov ax, [bp+4]
mul ax
mov bx, ax

mov ax, [bp+6]
mul ax
mov cx, ax

mov ax, [bp+8]
mul ax

a:
mov dx,ax
add dx,bx
cmp dx,cx
je YES

b:
mov dx,ax
add dx,cx
cmp dx,bx
je YES

c:
mov dx,bx
add dx,cx
cmp dx,ax
je YES

NO:
mov ax,0
jmp EXIT

YES:
mov ax,1

EXIT:
pop bp
ret
Pifagor endp

mov ax, 4c00h
int 21h

ends
end start

По дате
По рейтингу
Аватар пользователя
Ученик
1234567891011121314151617181920
   
  push ax 
  push bx 
  push cx 
 
  call Pifagor
  ; после возврата из Pifagor, код пойдет дальше
  ; и пойдет выполнять код Pifagor 
ends ; вот это вообще непонятно зачем
     ; есть процедура ниже тоже входит в данный сегмент

Pifagor PROC NEAR 
  push bp 
  mov bp, sp

...
; этот код не выполнится
  mov ax, 4c00h 
  int 21h
ends 


1234567891011121314151617181920
   push ax  
  push bx  
  push cx  
  
  call Pifagor

; тут нужно освобождать стек, так как после возврата
; из Pifagor, 6 байт будут висеть в стеке

; например

  push ax   
  push bx   
  push cx   
   
  call Pifagor

  pop cx
  pop bx
  pop ax 
Аватар пользователя
Ученик

Спасибо большое, всё получилось!!! ends писала, чтобы завершить программу, но уже поняла, что это было неправильно. Спасибо большое еще раз, что помогаете другим и делитесь своими знаниями! :)

Аватар пользователя
Оракул

1. Треугольник со сторонами 2 4 5 не "Пифагоров" и даже не прямоугольный
2. Программа проверяет треугольник только на прямоугольность
3. Что по твоему делает код после выполнения "строки" call Pifagor ?

Аватар пользователя
Ученик

Понятное дело, что он не Пифагоров, в моём случае программа должна вывести 0, как и сказано в задании.



Видео по теме