News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Why misstake compiler?

Started by vasant, November 07, 2005, 01:22:59 AM

Previous topic - Next topic

vasant

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.

MichaelW

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.

eschew obfuscation

vasant