Y1=7, если x<3. Как докончить? (Часть 2) - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Вот опять та же задача и та же проблема... http://www.cyberforum.ru/assembler/thread825450.html ХМ... нет, теперь другая проблема. В общем, помогите пожалуйста. Нужно теперь нужно сделать подпрограмму... вот код программы с макрокомандами, за которую большое спасибо

Mikl___

у.
.model small
.stack 30
.data
x dw 6
a dw 2
y dw ?
y1 dw ?
y2 dw ?
.code 
 
func1   macro x11,a11,y11
local MТ1,MT2,MT3
    push ax 
    mov ax,x11 
    cmp ax,3 
    jge MT1
    add ax,7
    JMP MT2 
MT1:    mov ax,a11
    test ax,ax
    jns MT3
    neg ax ;зменение знака 
MT3:    add ax,x11
MT2:    mov y11,ax
    pop ax  
endm 
func2   macro x11,a11,y22
local M1,M2
push ax 
    cmp x11,5
    jg M1
    mov y22,1
    jmp M2
M1: mov ax,a11
    add ax,x11
    mov y22,ax
M2:     pop ax  
endm 
 
.startup 
    mov ax,@data
    mov ds,ax
    func1 x,a,y1 ; вычисление y1
    func2 x,a,y2   ; вычисление y2
        mov dx,0
    mov ax,y1
    div y2
    mov y,dx; y = y1 mod y2
.exit 0 
end
.................. Вот я набрал вроде три файла: вычисление У1, У2 и У. Но, у меня бесконечное вычисление получается. посомтрите пожалуйста, что же не так блин Нахождение У1:
.model small 
.code 
iro61 proc far 
public iro61  
    push ax
    push bx 
    mov ax,6 
    cmp ax,3 
    jge MT1
    add ax,7
    JMP MT2 
MT1:    mov ax,2
    test ax,ax ; AND b CMP
    jns MT3
    neg ax ;изменение знака 
MT3:    add ax,6
MT2:    mov bx,ax
    pop ax  
ret 
iro61 endp 
.exit 0 
end
Нахождение У2:
.model small 
.code 
iro62 proc far 
public iro62 
push ax 
    cmp ax,5
    jg M1
    mov ax,1
    jmp M2
M1: mov ax,2
    add ax,6
    mov bx,ax
M2:     pop ax  
  
ret 
iro62 endp 
.exit 0 
end
Ну и У:
.model medium 
Title iro6
Extrn iro61:far
Extrn iro62:far 
.stack 30 
.data
x dw 6
a dw 2
y dw ?
y1 dw ?
y2 dw ?
.code 
.startup 
mov ax,@data
mov ds,ax
call iro61 
mov ax,@data
mov ds,ax
call iro62
add ax,bx 
mov y1,ax 
        mov dx,0
    mov ax,y1
    div y2
    mov y,dx
.exit 0 
end
Компануется все нормально, только вот чует моя п*п* что-то тут не так... Задача: http://www.cyberforum.ru/attachments/251122d1364842822
помогите пожалуйста

Решение задачи: «Y1=7, если x<3. Как докончить? (Часть 2)»

textual
Листинг программы
Program lab7;
var
a,x:word;
y1,y2:word;
{$L lab7_as}
function yy2 (var x1,a1):word;external;
function yy1 (var x1,a1):word;assembler;
asm
push ax
push bx
mov ax,x
cmp ax,3
jge @M1
add ax,7
jmp @M2
@M1: mov ax,a
test ax,ax
jns @M3
neg ax
@M3: add ax,x
@M2: mov bx,ax
pop ax
 
end;
begin
write('x= '); readln(x);
write('a= '); readln(a);
 y1:=yy1(x,a);
 y2:=yy2(x,a);
 writeln('*');
 write(y1 mod y2);
 readln;
 
end.

Объяснение кода листинга программы

  1. Программа написана на языке ассемблера.
  2. В программе используются 4 переменные: a, x, y1, y2 (переменные a и x читаются с клавиатуры, y1 и y2 вычисляются в программе).
  3. Переменная a инициализируется значением 7.
  4. Переменная x инициализируется значением, считываемым с клавиатуры.
  5. Переменная y1 вычисляется как сумма a и x, если x меньше 3, иначе как a.
  6. Переменная y2 вычисляется как сумма a и x.
  7. Выводится значение переменной y1, модуль значения переменной y2 (остаток от деления y1 на y2).
  8. Программа завершается чтением с клавиатуры.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы