Letterhd.gif (3329 bytes) Celebrating 20 Years
Home Contact us Search Sitemap

Example PC Assembler Code

MGT Computer Solutions >> Services >> Custom Programming >> Assembler >> Example PC Assembler Code

This example Microsoft Macro-Assembler v.5.1 program implements a function for validating byte data.  The function can be declared within and called from a Microsoft 16-bit BASIC program.


; NotInRange -- for quick validation of stuff like ALPHA, ALPHANUMERIC, etc.
NotInRange     PROC
; Proc NotInRange USES DS ES DI SI, OffsetWW:Word Target3:Word Search3:Word   ; masm 6
; DECLARE FUNCTION NotInRange% (offset%, WhatToSearch$, LowEnd%, HiEnd%) ' DECLARATION
; IF NotInRange%(1%, UCASE$(A$), 65, 90) < 2 THEN EXIT FUNCTION          ' EXAMPLE test for ALPHA
; Returns 0 if each byte in WhatToSearch$ is "within range", otherwise
; Returns the position of the first byte with an "out-of-range" value
Offset4   EQU  <[BP+12]>    ; NotInRange parm1  - the place to start search
Target4   EQU  <[BP+10]>    ; NotInRange parm2  - the string to search
LowEnd4   EQU  <[BP+8]>     ; NotInRange parm3  - the low end of the set of char values to accept
HiEnd4    EQU  <[BP+6]>     ; NotInRange parm4  - the high end of the set of char values to accept
     push bp                  ; entry sequence - saved old BP
     mov  bp,sp               ; set stack framepointer
     push ds                  ; save ds and friends
     push es
     push si
     mov  si,Offset4          ; put address of parameter in si
     mov  bx,[si]             ; offset value to bx
     dec  bx
     cmp  bx,0                ; is the user's offset bogus?
     jge  L003                ; if not bogus, avoid the following debacle
     jmp  B$ERR_FC            ; trust to BASIC's error handler
L003:
     mov  si,LowEnd4          ; put address of parm 3 in si
     mov  dl,[si]             ; offset value to dl
     mov  si,HiEnd4           ; put address of parm 4 in si
     mov  dh,[si]             ; offset value to dh
     mov  si,Target4          ; put string descriptor address in si
     mov  cx,[si]             ; put LEN(WorkArg$) in cx.
     mov  si,[si+2]           ; get string offset in si
TestForWithinRange:
     cmp  bx,cx               ; are we at end of string
     jae  OutsideRange        ; if so, jump
     mov  al,ds:[si+bx]       ; load the character
     cmp  al,dl
     jb   OutsideRange
     cmp  al,dh
     ja   OutsideRange
     inc  bx
     jmp  TestForWithinRange
OutsideRange:
     inc  bx                  ; adjust
     mov  ax,bx               ; returned offset goes into ax
     pop  si                  ; restore si
     pop  es                  ; restore es
     pop  ds                  ; restore ds
     pop  bp                  ; restore bp
     ret  8                   ; go back (skip 4 words on stack)
NotInRange        ENDP


"The Miracle Workers of Computing" since 1989
Celebrating 20 Years

Any trademark appearing on this page is the property of its owner.

Home Contact us Search Sitemap

Please send us your questions or comments about this web site.
Design, Implementation and Contents Copyright © 1998-2009 MGT Computer Solutions.  All rights reserved.
Last modified: August, 2009