Помогите, пожалуйста, с написанием программы...
Код:
;+Пользователь вводит два числа А и В в десятичном виде. Программа должна:
;+1. Посчитать С=А+В*2.
;2. Если третий бит числа С установлен, то вывести на экран С в двоичном виде, в противном случае, вывести на экран С/2 в двоичном виде.
;+3. Написать макрос для вывода результата
;+4. Написать процедуру для ввода чисел
;+5. Написать макрос для расчета
;+6. Передача параметров через стек
;+7. Используйте стандартные директивы сегментации и формат сом-программы.
cseg segment
org 100h
coutStr macro a ;вывод строки
push ax
push dx
mov ah, 9
mov dx, offset a
int 21h
pop dx
pop ax
endm
calc macro
local m1, m2
shl dx, 1
coutStr endl
coutStr mes3
print dx
coutStr endl
add ax, dx
coutStr mes4
print ax
coutStr endl
mov dx, ax
and dx, 1000b
cmp dx, 1000b
je m1
coutStr mes6
shr ax, 1
print ax
jmp m2
m1:
coutStr mes5
print ax
m2:
endm
print macro a ;выводит ax в двоичном
local cicl
push dx
push ax
mov bx, a
mov cx, 16
cicl:
xor dx, dx
sal bx, 1
adc dl, 30h
mov ah, 2
int 21h
loop cicl
pop ax
pop dx
endm
main:
coutStr mes1
call input
push dx
coutStr endl
coutStr mes2
call input
pop ax
calc ;a-ax,b-dx
int 20h
;main endp
input proc ;ввод числа
jmp start
startErr:
coutStr endl
coutStr inErr
start:
mov cx, 3
xor dx, dx
m1:
xor ax, ax
mov ah, 1h
int 21h
sub al, 30h
cmp al, 9
ja m2
xor bx, bx
mov bl, al
xor ax, ax
mov al, dl
xor dx, dx
mov dl, 10
mul dl
cmp ah,0
ja startErr
xor dx, dx
mov dl, al
add dx, bx
cmp dh, 0
ja startErr
loop m1
m2:
ret 0
input endp
mes1 db "vvedite A(00 < A < 255): $"
mes2 db "vvedite B(00 < B < 255): $"
mes3 db "B*2 = $"
mes4 db "C = A+B*2 = $"
mes5 db "C = $"
mes6 db "C/2 = $"
inErr db "Owibka vvoda!! Vvedite zanovo: $"
endl db " ", 10, '$'
cseg ends
end main
;+1. Посчитать С=А+В*2.
;2. Если третий бит числа С установлен, то вывести на экран С в двоичном виде, в противном случае, вывести на экран С/2 в двоичном виде.
;+3. Написать макрос для вывода результата
;+4. Написать процедуру для ввода чисел
;+5. Написать макрос для расчета
;+6. Передача параметров через стек
;+7. Используйте стандартные директивы сегментации и формат сом-программы.
cseg segment
org 100h
coutStr macro a ;вывод строки
push ax
push dx
mov ah, 9
mov dx, offset a
int 21h
pop dx
pop ax
endm
calc macro
local m1, m2
shl dx, 1
coutStr endl
coutStr mes3
print dx
coutStr endl
add ax, dx
coutStr mes4
print ax
coutStr endl
mov dx, ax
and dx, 1000b
cmp dx, 1000b
je m1
coutStr mes6
shr ax, 1
print ax
jmp m2
m1:
coutStr mes5
print ax
m2:
endm
print macro a ;выводит ax в двоичном
local cicl
push dx
push ax
mov bx, a
mov cx, 16
cicl:
xor dx, dx
sal bx, 1
adc dl, 30h
mov ah, 2
int 21h
loop cicl
pop ax
pop dx
endm
main:
coutStr mes1
call input
push dx
coutStr endl
coutStr mes2
call input
pop ax
calc ;a-ax,b-dx
int 20h
;main endp
input proc ;ввод числа
jmp start
startErr:
coutStr endl
coutStr inErr
start:
mov cx, 3
xor dx, dx
m1:
xor ax, ax
mov ah, 1h
int 21h
sub al, 30h
cmp al, 9
ja m2
xor bx, bx
mov bl, al
xor ax, ax
mov al, dl
xor dx, dx
mov dl, 10
mul dl
cmp ah,0
ja startErr
xor dx, dx
mov dl, al
add dx, bx
cmp dh, 0
ja startErr
loop m1
m2:
ret 0
input endp
mes1 db "vvedite A(00 < A < 255): $"
mes2 db "vvedite B(00 < B < 255): $"
mes3 db "B*2 = $"
mes4 db "C = A+B*2 = $"
mes5 db "C = $"
mes6 db "C/2 = $"
inErr db "Owibka vvoda!! Vvedite zanovo: $"
endl db " ", 10, '$'
cseg ends
end main
В тексте ошибки должен был быть номер строки.
Надо попробовать погонять программу под отладчиком
На первый взгляд страшных инструкций обнаружено не было
Код:
cseg segment
ASSUME cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
ASSUME cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
Если не пользуешься упрощённым описанием сегментов - не забывай про ASSUME.
У меня TASM отказывался даже компилировать без неё.
И ещё - перевод строки это не только 10 - это
Код:
endl db 13, 10, '$'