The MASM Forum Archive 2004 to 2012

Miscellaneous Forums => 16 bit DOS Programming => Topic started by: vasant on November 07, 2005, 01:22:59 AM

Title: Why misstake compiler?
Post by: vasant on November 07, 2005, 01:22:59 AM
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.
Title: Re: Why misstake compiler?
Post by: MichaelW on November 07, 2005, 01:48:55 AM
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.

Title: Re: Why misstake compiler?
Post by: vasant on November 08, 2005, 05:03:31 AM
Thank you.

It is my unknow.