News:

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

nasm to tasm conversion

Started by skywalker, March 18, 2006, 02:40:18 PM

Previous topic - Next topic

skywalker

; celsius.asm Nasm code
;                       Need this converted to Tasm style
;                       so I can help him

BITS 16        ;16 bit instructions used
    ORG  100h           ;start of .com program


    SECTION .text    ;text section follows


main:
        mov     si,prompt1
        call    PrintString

        mov     di,Instring
        call    ReadString
        call    CRLF                ;INPUT Instring$
        mov     si,Instring
        call    StrToNum            ;ax = VAL(InString$)

; -------  ax = (int)((ax - 32) * 5 / 9) -----------

        sub     ax,32    ;ax = ax - 32
        mov     bx,5
        imul    bx       ;ax = ax * 5
        mov     bx,9
        idiv    bx       ;ax = ax / 9 (dx = remainder, ax = quotient)
        xchg    ax,dx    ;now ax = remainder and dx = quotient

; round up the value
        mov     bl,5
        idiv    bl       ;al = al / bl
        cbw              ;convert byte to word
        add     ax,dx    ;ax = ax + quotient

        mov     si,Instring
        call    NumToStr            ;InString$ = STRING$(ax)
        mov     si,Instring
        call    PrintString
        call    CRLF                ;PRINT InString$

;--------------------------------------------------
        mov     ax,4C00h
        int     21h

;** READ KEYBOARD TO STRING POINTED TO BY DI **
;** ReadString(SI) **

ReadString:
        push    dx
        push    ax
        push    di
        push    bx
        mov     bx,di
NextChar:
        sub     ah,ah
        int     16h     ;wait for key function
        cmp     al,13   ;[ENTER] key?
        jz      Done
        cmp     al,8    ;[<-] key?
        jz      BackSpace
        mov     [di],al ;save character
        inc     di
        mov     dl,al   ;
        mov     ah,2
        int     21h     ;echo character
        jmp     NextChar

BackSpace:
        cmp     di,bx   ;at beginning?
        jz      NextChar        ;yep no back space
        dec     di
        mov     ah,2
        mov     dl,8
        int     21h     ;backspace
        mov     ah,2
        mov     dl,' ';
        int     21h     ;PRINT " ";
        mov     ah,2
        mov     dl,8
        int     21h     ;backspace
        jmp     NextChar

Done:
        sub     al,al   ;clear al
        mov     [di],al ;null string
        pop     bx
        pop     di
        pop     ax
        pop     dx
        ret

;** PRINT STRING POINTED TO BY SI **
PrintString:
        push    dx
        push    ax
        push    si
PrintLoop:
        mov     al,[si]
        inc     si
        or      al,al   ;test for al=0
        jz      Finish
        mov     dl,al
        mov     ah,2
        int     21h     ;print character
        jmp     PrintLoop
Finish:
        pop     si
        pop     ax
        pop     dx
        ret

CRLF:
        push    ax
        push    dx
        mov     ah,2
        mov     dl,13
        int     21h
        mov     dl,10   ;lf
        int     21h
        pop     dx
        pop     ax
        ret

;** Convert string pointed to by SI to number in ax **
StrToNum:
        push    bx
        push    cx
        push    dx
        push    si
        mov     BYTE [sign],0    ;assume positive number
        sub     cx,cx   ;cx = 0
        mov     bx,10   ;base 10
        mov     al,[si]
        cmp     al,'-'
        jne     NextDigit ;positive number
        inc     si        ;skip '-' character
        mov     BYTE [sign],1      ;negative number
NextDigit:
        mov     al,[si] ;get digit
        inc     si
        sub     ah,ah   ;ah = 0
        sub     al,'0'  ;convert to 0-9 value
        jc      NotDecDigit
        cmp     al,10   ;
        ja      NotDecDigit
        xchg    ax,cx   ;ax = old value cx = new value
        mul     bx      ;ax = ax * 10
        add     cx,ax   ;add new result
        jno     NextDigit
        call    OverFlow
NotDecDigit:
        mov     ax,cx   ;ax = result
        cmp     dl,BYTE [sign]
        jz      positive
        neg     ax      ;was negative signed
positive:
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret

OverFlow:
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        call    CRLF
        mov     si,error2
        call    PrintString
        call    CRLF
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret

;** Convert number in ax to string pointed to by DI **
NumToStr:
        push    ax
        push    dx
        push    cx
        push    bx
        push    di
        mov     bx,10
        xor     cx,cx
        cmp     ax,0
        jge     NotZero ;ax positive number
        neg     ax      ;2's complement
        mov     BYTE [di],'-'
        inc     di
NotZero:
        xor     dx,dx   ;set upper word of N to 0
        div     bx      ;N/10 and n mod 10
        add     dl,'0'  ;remainder in dl convert to asc
        push    dx      ;push one digit onto stack
        inc     cx      ;count digits
        or      ax,ax   ;n = 0?
        jne     NotZero
PopDigit:
        pop     ax      ;last digit first
        mov     [di],al ;
        inc     di
        loop    PopDigit
        sub     al,al   ;al = 0
        mov     [di],al ;null string
        pop     di
        pop     bx
        pop     cx
        pop     dx
        pop     ax
        ret

WaitKey:
        mov     ah,7
        int     21h
        ret

section .data


prompt1 db      '  Enter number: ',0

error1  db      'overflow',0
error2  db      'input OVERFLOW',0

sign    db      0       ;sign of number

section .bss

Instring        resb      256


WebN

skywalker

This guy's code is pretty hacked up. Did the best I could so far.
Tried to minimise reposting of previous stuff.

I am not sure he needs to be using si and di for this, but work on each digit entered
by the user. Prob need to save more regs to for all the calls he has.

            After number is input, you have to hit enter.
            Always gives -18 for a result.

            Prompt needs more info.
            Like Input degrees C or F
            User isn't a mind reader.
            Also like Frank said, you need error checking.

; celsius.asm Temp conversion program   March 2006
;             Tasm code                 Sell See Us
;             "If it crashes, it ain't my fault. :-)"         
;
.model       small
.stack  200h
.386

.data

; data goes here


prompt1  db      'Enter number:','$'

error1   db      "Overflow",'$'
error2   db      'Input OVERFLOW','$'

sign     db      0       ;sign of number
Instring db      4 dup(?)

.code

main:

        mov      ax,@data   
        mov      ds,ax

        lea      dx,prompt1 ; Print using interrupts,
                           
        mov      ah,9   
        int      21h

        mov      Instring,4         ; max characters in input
        mov      dx,offset Instring ; store input here
        mov      ah,0ch             ; flush keyboard buffer
        mov      al,0ah             ; buffered keyboard input
        int      21h

        mov     di,offset Instring
        call    ReadString
        call    CRLF                ;INPUT Instring$
        mov     si,offset Instring
        call    StrToNum            ;ax = VAL(InString$)

; -------  ax = (int)((ax - 32) * 5 / 9) -----------

        sub     ax,32    ;ax = ax - 32
        mov     bx,5
        imul    bx       ;ax = ax * 5
        mov     bx,9
        idiv    bx       ;ax = ax / 9 (dx = remainder, ax = quotient)
        xchg    ax,dx    ;now ax = remainder and dx = quotient

; round up the value
        mov     bl,5
        idiv    bl       ;al = al / bl
        cbw              ;convert byte to word
        add     ax,dx    ;ax = ax + quotient

        mov     si,offset Instring
        call    NumToStr            ;InString$ = STRING$(ax)
        mov     si,offset Instring
        call    PrintString
        call    CRLF                ;PRINT InString$

        mov     ax,4C00h
        int     21h

ReadString  proc
        push    dx
        push    ax
        push    di
        push    bx
        mov     bx,di
NextChar:
        sub     ah,ah
        int     16h     ;wait for key function
        cmp     al,13   ;[ENTER] key?
        jz      Done
        cmp     al,8    ;[<-] key?
        jz      BackSpace
        mov     [di],al ;save character
        inc     di
        mov     dl,al   ;
        mov     ah,2
        int     21h     ;echo character
        jmp     NextChar

BackSpace:
        cmp     di,bx   ;at beginning?
        jz      NextChar        ;yep no back space
        dec     di
        mov     ah,2
        mov     dl,8
        int     21h     ;backspace
        mov     ah,2
        mov     dl,' ';
        int     21h     ;PRINT " ";
        mov     ah,2
        mov     dl,8
        int     21h     ;backspace
        jmp     NextChar

Done:
        sub     al,al   ;clear al
        mov     [di],al ;null string
        pop     bx
        pop     di
        pop     ax
        pop     dx
        ret
endp

PrintString proc
        push    dx
        push    ax
        push    si
PrintLoop:
        mov     al,[si]
        inc     si
        or      al,al   ;test for al=0
        jz      Finish
        mov     dl,al
        mov     ah,2
        int     21h     ;print character
        jmp     PrintLoop
Finish:
        pop     si
        pop     ax
        pop     dx
        ret
endp

CRLF    proc

        push    ax
        push    dx
        mov     ah,2
        mov     dl,13
        int     21h
        mov     dl,10   ;lf
        int     21h
        pop     dx
        pop     ax
        ret
endp

StrToNum    proc
        push    bx
        push    cx
        push    dx
        push    si
        mov     BYTE [sign],0    ;assume positive number
        sub     cx,cx   ;cx = 0
        mov     bx,10   ;base 10
        mov     al,[si]
        cmp     al,'-'
        jne     NextDigit ;positive number
        inc     si        ;skip '-' character
        mov     BYTE [sign],1      ;negative number
NextDigit:
        mov     al,[si] ;get digit
        inc     si
        sub     ah,ah   ;ah = 0
        sub     al,'0'  ;convert to 0-9 value
        jc      NotDecDigit
        cmp     al,10   ;
        ja      NotDecDigit
        xchg    ax,cx   ;ax = old value cx = new value
        mul     bx      ;ax = ax * 10
        add     cx,ax   ;add new result
        jno     NextDigit
        call    OverFlow
NotDecDigit:
        mov     ax,cx   ;ax = result
        cmp     dl,BYTE [sign]
        jz      positive
        neg     ax      ;was negative signed
positive:
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
endp

OverFlow    proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        call    CRLF
        mov     si,offset error2
        call    PrintString
        call    CRLF
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
endp

NumToStr    proc
        push    ax
        push    dx
        push    cx
        push    bx
        push    di
        mov     bx,10
        xor     cx,cx
        cmp     ax,0
        jge     NotZero ;ax positive number
        neg     ax      ;2's complement
        mov     BYTE ptr [di],'-'
        inc     di
NotZero:
        xor     dx,dx   ;set upper word of N to 0
        div     bx      ;N/10 and n mod 10
        add     dl,'0'  ;remainder in dl convert to asc
        push    dx      ;push one digit onto stack
        inc     cx      ;count digits
        or      ax,ax   ;n = 0?
        jne     NotZero
PopDigit:
        pop     ax      ;last digit first
        mov     [di],al ;
        inc     di
        loop    PopDigit
        sub     al,al   ;al = 0
        mov     [di],al ;null string
        pop     di
        pop     bx
        pop     cx
        pop     dx
        pop     ax
        ret
endp

WaitKey proc
        mov     ah,7
        int     21h
        ret
endp

end     main

Rockphorr

What is the aim of conversion ?
Masm is enugth.
Strike while the iron is hot - Бей утюгом, пока он горячий

IAO

Hi to all: My English is poor. But I try.

Mr. skywalker:
Your old picture, was prettier, than this cockroach.
I do not want to offend.
This Picture is very ugly. I remember to the people by the pictures.
Now I must change your image in my mind.
Now, in my mind, you are very ugly.
I request pardon to you. :(

Thank you very much..

Bye ('_').
"There is no way to peace. Peace is the way."    Mahatma Gandhi

skywalker

Quote from: Rockphorr on March 22, 2006, 11:56:20 AM
What is the aim of conversion ?
Masm is enugth.

Not sure if I understand what you're saying. He wants to convert degrees F to C.

I am trying to figure out how to get a 2 or 3 digit number into any register. I would want to limit the input to 3 digits, 256 decimal max.

Thanks.

skywalker

Quote from: IAO on March 22, 2006, 07:56:17 PM
Hi to all: My English is poor. But I try.

Mr. skywalker:
Your old picture, was prettier, than this cockroach.
I do not want to offend.
This Picture is very ugly. I remember to the people by the pictures.
Now I must change your image in my mind.
Now, in my mind, you are very ugly.
I request pardon to you. :(

Thank you very much..

Bye ('_').

The picture is a grasshopper. I thought it was funny. I'll may look for another picture.

Take care.

Rockphorr

What is the aim of conversion nasm to tasm?
Style of code is not good sometimes.
Do not use @data. "XCHG" it to seg(var_name)
;----------------------------------
mov      ax,@data   
mov      ds,ax
lea      dx,prompt1 ; Print using interrupts
;------------------------------------
to
;--------------------------------------
mov      ax,seg(prompt1)
mov      ds,ax
lea      dx,prompt1 ; Print using interrupts
;-----------------------------------------------------

Thanks.
Strike while the iron is hot - Бей утюгом, пока он горячий

skywalker

Quote from: Rockphorr on April 01, 2006, 10:49:26 AM
What is the aim of conversion nasm to tasm?
Style of code is not good sometimes.
Do not use @data. "XCHG" it to seg(var_name)
;----------------------------------
mov      ax,@data   
mov      ds,ax
lea      dx,prompt1 ; Print using interrupts
;------------------------------------
to
;--------------------------------------
mov      ax,seg(prompt1)
mov      ds,ax
lea      dx,prompt1 ; Print using interrupts
;-----------------------------------------------------

Thanks.


I am trying to help someone and I need to convert it to Tasm which is the compiler I have.

Later.