Задание.
Перекодировщик вводимых с клавиатуры чисел. Двоичный-десятичный-шестнадцатиричный код. (С клавиатуры вводятся числа в любом из этих кодов). Перекодированное число в двух других кодах выводятся на экран.
Это наш курсач с Гордым. Почемуто он у нас неочень двигается,но чтото у нас уже есть:
.model small
.386
.stack 100h
.data
firstmess db "Select counting system,please: d-decimal; b-binary,h-hexadecimal",13,10,'$'
mainMess db "Enter the number",13,10,'$'
endMess db "Programm has finished its work. Do You want to repeat?(y/n)",13,10,'$'
ent db 13,10,'$'
KOL Dw ?
.code
MAIN PROC FAR
MOV AX,@data
MOV DS,AX
MOV ES,AX
;------Programma---------
REPEAT:
;--------4istka---------
MOV AH,0 ;номер функции установки режима дисплея
MOV AL,2 ;код режима 80*25 черно-белого
INT 10H ;очистка экрана
;--------End $istka------
; ----DIALOG------------
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET firstmess ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
mov ah,1h ;код ввода
int 21h ;прерывания на ввод
cmp al,"b" ;сраснение с указателем на двоичную СС
JE goBinary ;переход если да
cmp al,"h" ;шестнадцатиричная
JE goHD ;если да - переход
cmp al,"d" ;десятичная
JE goDecimal ; переход если да
JMP REPEAT ;Переход в начало.Если введеная неверная буква
; ---End dialog---------
;--------PART FOR BINARY-----------
goBinary:
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес Entera
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET mainMess ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
;---------4Itaem------------------
SUB CX,CX
FOR1: MOV AH,1
INT 21H
CMP AL,'1'
JNE p1
JMP p2
p1: CMP AL,'0'
JNE PEREV
p2:
MOV DL,AL
SUB DH,DH
PUSH DX
INC CX
JMP FOR1
;---------End 4itaem---------------
;---------Perevod--------------------
PEREV: MOV KOL,CX
SUB EAX,EAX
SUB BX,BX
FOR2:
SUB EDX,EDX
POP BX
CMP BX,0
JE FOR2
SUB KOL,CX
MOV EDX,1
MOV BX,CX
MOV CX,kol
SHL EDX,CL
ADD EAX,EDX
MOV CX,BX
ADD KOL,CX
LOOP FOR2
;---------END Perevod------------------
;----------Vuvod----------------------
MOV EBX,EAX
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
;-----------End Vuvod-----------------
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
JMP Povtor ; Переход на конец
;--------END BINARY------------------
;--------PART FOR DECIMAL------------
goDecimal:
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес Entera
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET mainMess ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
JMP Povtor ;переход на конец
;--------END DECIMAL-------------------
;--------PATRT FOR HEXADECIMAL---------
goHD:
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес Entera
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET mainMess ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес строки
INT 21h ;вызов прерывания для вывода
MOV ah,9h ;код вывода на экран
MOV dx,OFFSET ent ;заносим в ДХ адрес Entera
INT 21h ;вызов прерывания для вывода
JMP Povtor ;Переход на конец программы
;--------END HD------------------------
;--------Povtor?--------
Povtor:
MOV ah,9h ;код вывода
MOV dx,OFFSET endMess ;Адрес в ДХ
INT 21h ;Прерывание вывода
mov ah,1h ;Код ввода
int 21h ;Прерывание ввода
cmp al,"y" ;Сравнение ответа
JE REPEAT ;Повтор если да
;--------Povtor End------
;---End-------------------
MOV AH,4CH ;окончание
INT 21H ;Программы
MAIN ENDP
END MAIN