www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/04/15/09:50:47

From: beppu AT rigel DOT oac DOT uci DOT edu (John Beppu)
Newsgroups: comp.os.msdos.djgpp
Subject: NASM Propaganda
Date: 15 Apr 1997 10:32:01 GMT
Organization: University of California, Irvine
Lines: 324
Message-ID: <5ivlf1$eif@news.service.uci.edu>
NNTP-Posting-Host: rigel.oac.uci.edu
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

[NASM Propaganda]
 
    If you would like to
        |
        +-- use assembly under x86 Linux
        +-- use assembly with DJGPP
        +-- assemble MMX instructions
        +-- assemble PPro instructions
        +-- be able to use an x86 assembler on a non-x86 platform
        +-- output various object file formats such as
            |
            +-- bin
            +-- a.out
            +-- coff
            +-- elf
            +-- as86
            +-- obj
            +-- win32
            +-- rdf
 
    and are willing to pay 0 dollar$/pounds/en/etc. for such an
    assembler, NASM might be for you.  If you already know TASM or
    MASM syntax, then moving to NASM will not be hard.  If you are
    not comfortable with the AT&T assembly syntax, now you have an
    alternative.  If you are afraid that your current assembler
    will not keep up with current processors, NASM comes with
    complete source so adding support for new instructions should
    not be /too/ difficult.
 
 
[The Shortcomings]
 
    At the moment, NASM lacks
        |
        +-- macro support
        |   |
        |   +-- use a preprocessor like "cpp" or "m4" instead
        |
        +-- an easy way to align data
            |
            +-- hand-align or try the kludge mentioned in docs
 
    So, if you have been spoiled by macros (Randy Hyde ;-), or are
    extremely picky about data alignment, NASM may disappoint
    you.
 
    However, these shortcomings can be overcome, and future releases
    of NASM will probably address these issues.
 
 
[In Conclusion]
 
    I ask that anyone who hasn't given NASM a chance to please
    do so.  NASM is a very usable assembler.
 
    NASM binaries are small, so please keep it around even if you
      don't want to use it.
 
    NASM is another fine product from the UK.
 
ftp://sunsite.unc.edu/pub/Linux/devel/lang/assemblers/nasm-0.94.tar.gz
ftp://wcarchive.cdrom.com/pub/simtelnet/msdos/asmutl/nasm093s.zip
 
[Peace Offering]

    [note] 
    (I was going to cross-post at first, but the thought of
     Nudds polluting comp.os.msdos.djgpp made me reconsider.)

    I assume most of you comp.lang.asm.x86 folk still use DOS,
    so here's a little .com file you can test NASM out with.
 
    If you've got a (286 and a VGA) or better, and if you still
    use text-mode in DOS, you don't have to use the same, old,
    boring colors anymore.  (yay.)  This will also work with the
    Win95 dos shell.
 
    I'm a Linux user, but I must give respect
    to the people at Microsoft responsible for the dos shell,
    because they did a great job.  I was surprised to see the
    EGA and VGA port accesses being caught and emulated within
    the dos shell.  (When will DOSEMU be able to do this?! ;-)
 
    If you don't have "cpp", just get rid of all the C/C++ styled
    comments.  I didn't use any #define statements, because I was
    a bit worried about the availability of "cpp".  I didn't want
    people to be bothered to get the DJGPP package which contains
    the DOS port of "cpp".
 
 
--8<-Makefile-----------------------------------------------------------------
all : setpal.com
 
setpal.com : setpal.s
        nasm -o setpal.com setpal.s
 
setpal.s : setpal.asm
        cpp -P setpal.asm setpal.s
 
 
--8<-setpal.asm---------------------------------------------------------------
[bits 16]
[section .text]
[org 100h]
 
coder           equ     beppu
 
        // startUP
 
                xor     ax,ax
                mov     bp,argv
                mov     [argv+7],ax     ; setup for .length_check
                mov     di,arg_buffer
                mov     bx,000Dh
                mov     cx,63
                call    _clP_save
 
                push    ds
                pop     es
 
/* unmodular Philip-styled x86 asm (forgive me)
 
usage:  setpal 000f021f
               -+-r-g-b
                | | | + ( blue          ) -+
                | | +-- ( green         )  | hexadecimal,
                | +---- ( red           )  | please (no upper case)
                +------ ( palette entry ) -+
 
%% :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
 
_setpal:
                // Only one parameter desired.
 
                mov     di,parser_table
                cmp     cx,byte 1
                mov     ax,0ffffh
                jne     near .end
 
                // Generate parser table.
 
                mov     cx,128
                mov     bx,di
                xor     dx,dx
                xor     bp,bp
                rep     stosw
 
                mov     [bx+30h],bp     ; 0,1
                mov     si,[argv]
                mov     [bx+32h],bp     ; 2,3
                mov     [bx+34h],bp     ; 4,5
                mov     [bx+36h],bp     ; 6,7
                mov     [bx+38h],bp     ; 8,9
 
                mov     ax,[si+7]
                mov     [bx+61h],dl     ; a,
                mov     [bx+62h],bp     ; b,c
                cmp     ah,1
                mov     [bx+64h],bp     ; d,e
                mov     [bx+66h],dl     ; f
                sbb     bp,bp
 
                // Parse parameter for validity
                // There must be exactly 8 characters within
                // the subset of { '0'..'9' && 'a'..'b' |
 
.length_check:
                xor     bx,bx
                and     ax,bp
                jz      near .end
 
                mov     di,parser_table
                mov     cx,8
                xor     ax,ax
.validity_check:
                mov     bl,[si]
                inc     si
                mov     dl,[bx+di]
                or      ax,dx
                dec     cx
                jnz     .validity_check
 
                mov     dx,0202h
                mov     cx,0100h
                mov     bx,parser_table
                test    ax,ax
                jnz     near .end
 
                // Turn parser_table into a conversion table
                // using poor man's MMX
 
                mov     [bx+30h],cx     ; 0,1
                add     cx,dx
                mov     [bx+32h],cx     ; 2,3
                add     cx,dx
                mov     [bx+34h],cx     ; 4,5
                add     cx,dx
                mov     [bx+36h],cx     ; 6,7
                add     cx,dx
                mov     [bx+38h],cx     ; 8,9
                add     cx,dx
                mov     [bx+61h],cl     ; a
                add     cx,0101h
                mov     [bx+62h],cx     ; b,c
                add     cx,dx
                mov     [bx+64h],cx     ; d,e
                inc     ch
                mov     [bx+66h],ch     ; f
 
                // Convert parameter    ; si == argv[1]
 
                mov     si,[argv]
                sub     sp,byte 4       ; a stackframe?
                mov     di,bx
                mov     bp,sp
                xor     bx,bx
                xor     ax,ax
                mov     cx,4
.convert
                mov     bl,[si]
                mov     al,[bx+di]
                sal     al,4
                mov     bl,[si+1]
                add     si,byte 2
                mov     dl,[bx+di]
                or      al,dl
                mov     [bp],al
                inc     bp
                dec     cx
                jnz     .convert
 
                mov     bp,sp           ; indeed.  a stackframe.
 
                // Set palette
 
                mov     dx,3c8h
                mov     al,[bp]
                lea     si,[bp+1]
                mov     cx,3
                out     dx,al
                inc     dx
                rep     outsb
                add     sp,byte 4       ; bye-bye, stackframe.
 
.end:
                retn
 
 
/* Proc clP_save far (8086+,DOS,realmode) ::::::::::::::::::::::::::::::::::
 
   IN:                                   OUT:
     DS : seg Program Segment Prefix       CX : # of parameters
     ES : seg of buffers
     DI : offset parameter_buffer | relative
     BP : offset offset_buffer    | to ES
     CX : (len.b(param_b) - 1)
     BL : (len.w(offset_b))                offset param_b  : filled
     BH : string termination byte          offset offset_b : filled
 
   registers : ax bx cx dx di si bp (used)
 
%% :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
 
_clP_save:
                cld
                mov     si,80h                  ; # of chars on command-line
                mov     al,[si]
                inc     si
                cmp     al,cl
 
                jge     .noxchg
                cbw
                mov     cx,ax                   ; looking for smaller one
        .noxchg:
                jcxz    .empty
                mov     al,20h
                mov     ah,bh
                xor     bh,bh
                mov     dx,cx                   ; save final CX for later
 
                push    di
                rep     movsb                   ; copy eVerything
                pop     di
 
;+----
                mov     cx,bx
.werk:
                push    cx
                mov     cx,dx
                repe    scasb                   ; while space
                dec     di
                mov     [es:bp],di              ; set offset
                inc     cx
                add     bp,byte 2
                repne   scasb                   ; while NOT space
                jcxz    .out
                mov     [es:di - 1],ah
                mov     dx,cx
                pop     cx
                loop    .werk
;+----
 
        .out:   mov     [es:di],ah
                pop     cx
                dec     cx
                sub     cx,bx
                neg     cx
                ret
 
        .empty:
                xor     cx,cx
                retn
 
 
[section .bss]
 
argc            resw    1
argv            resw    15
arg_buffer      resb    64
 
parser_table    resb    256

-- 
  beppu AT uci DOT edu .............................................................

- Raw text -


  webmaster     delorie software   privacy  
  Copyright 2019   by DJ Delorie     Updated Jul 2019