Code
[0.ASM]
.MODEL SMALL
INCLUDE MACRO.MAC
public data,basein,baseout
extrn base:near,in_2:near,in_10:near,in_16:near
extrn out_2:near,out_10:near,out_10:near
.stack 100h
.data
text_1 db 'Put number:$'
text_2 db 'Try again Yes/No or Select new Base (Y/N/B):$'
text_3 db 'Output:$'
error_basein db 'Error basein$'
error_baseout db 'Error baseout$'
data db ?
basein db ?
baseout db ?
.code
main proc
mov ax,@data
mov ds,ax
mov es,ax
m0:
call base
DOS
main endp
;---------------------------------------------------------------
end
[1.asm]
.MODEL SMALL
WRITELN MACRO DATA
MOV AH,9
LEA DX,DATA
INT 21H
ENDM
;_________________________________________________
LN MACRO
MOV AH,2
MOV DL,10
INT 21H
MOV DL,13
INT 21H
ENDM
;__________________________________________________
SHOW MACRO
mov ah,2
mov dl,al
int 21h
endm
;___________________________________________________
PUBLIC BASE
Extrn basein:byte,baseout:byte
.DATA
TEXT_1 DB 'Base of input-number : $'
TEXT_2 DB 'Base of output-number : $'
TEXT_0 DB 'Select base',0ah,0dh,
'1) base2',0ah,0dh,
'2) base10',0ah,0dh,
'3) base16','$'
.CODE
BASE PROC NEAR
WRITELN TEXT_0
MOV AH,2
MOV DL,10 ;NEW LINE
INT 21H
MOV DL,13
INT 21H
WRITELN TEXT_1
A1: MOV AH,8
INT 21H
CMP AL,'1'
JE A2
CMP AL,'2'
JE A2
CMP AL,'3'
JE A2
JMP A1
A2:
SHOW
SUB AL,30H
MOV basein,AL
LN
WRITELN TEXT_0
LN
WRITELN TEXT_2
A3: MOV AH,8
INT 21H
CMP AL,'1'
JE A4
CMP AL,'2'
JE A4
CMP AL,'3'
JE A4
JMP A3
A4: SHOW
SUB AL,30H
MOV baseout,AL
BASE ENDP
;----------------------------------------------------------
end
[2.asm]
.MODEL SMALL
SHOW MACRO
MOV AH,2
MOV DL,AL
INT 21H
ENDM
;___________________________________________________
extrn data:byte
public in_2,in_10,in_16
.Data
Num_16 db '0123456789ABCDEF'
Num_10 db '01234567890'
;----------------------------------------------------
.CODE
in_2 proc
mov cx,8 ;count loop
mov bx,0 ;store data
b1: mov ah,8
int 21h
cmp al,'1'
je b2
cmp al,'0'
je b2
jmp b1
b2: show ;show char in al
sub al,30h
cmp al,1
jne b3
stc
rcl bl,1
jmp b4
b3: clc
rcl bl,1
b4:
loop b1
mov data,bl
ret
in_2 endp
;------------------------------------------------------------------------
in_16 proc
mov bx,0
lea di,Num_16
mov cx,2
b1: mov ah,8
int 21h
push cx
mov cx,16
repne scasb ;check char from list
je b2
jcxz b1
b2: show
cmp al,'9'
ja b3
sub al,30h
b3: sub al,37h
mov cl,4
rol bl,cl
mov bl,al
pop cx
loop b1
mov data,bl
ret
in_16 endp
;-------------------------------------------------------------------------
in_10 proc
mov bx,0
mov cx,2
lea di,Num_10
b1: mov ah,8
int 21h
push cx
mov cx,10
repne scasb
je b2
jcxz b1
b2: show
pop cx
cmp cx,1
jne b3
mov dl,10
mul dl
b3: add bl,al
loop b1
mov data,bl
ret
in_10 endp
;-------------------------------------------------------------------------
end
[3.asm]
.MODEL SMALL
;
HEX MACRO DATA
LOCAL H1,END_
CMP DATA,9
JA H1
ADD DATA,37H
JMP END_
H1: ADD DATA,30H
END_:
ENDM
;_____________________________________________________________________
public out_2,out_10,out_16
extrn data:byte
.CODE
out_2 proc
mov cx,8
mov bx,0
mov bl,data
mov ah,2
c1: rcl bl,1
jc c2
mov dl,'0'
jmp c3
c2: mov dl,'1'
c3: int 21h
loop c1
ret
out_2 endp
;-------------------------------------------------------------------------
out_16 proc
mov bx,0
mov bl,data
mov cl,4
rol bx,cl
ror bl,cl
HEX bh
HEX bl
mov ah,2
mov dl,bh
int 21h
mov dl,bl
int 21h
ret
out_16 endp
;-------------------------------------------------------------------------
out_10 proc
mov al,data
mov bl,10
div bl
mov bh,ah ;remender
mov ah,2
mov dl,al
int 21h
mov dl,bh
int 21h
ret
out_10 endp
;-------------------------------------------------------------------------
end
Step compile.
ml 0.asm /c
ml 1.asm /c
ml 2.asm /c
ml 3.asm /c
Step link.
link 0+1+2+3
Question
Why After "call BASE"from 0.asm ,program will call in_2 proc from 2.asm .
Main program is 0.asm
I think is link worng. If I think right.
How Il clear this problem?
Please help me.
The BASE procedure has no return instruction, so the call does not return until the return instruction at the end of in_2 procedure executes.
Thank you.
It is my unknow.