• No results found

SOME VERY USEFUL MODULES

In document Solutions Mazidi - x86 5e - IRM (Page 51-57)

9. TITLE PROB9 PAGE 60,132 EXTRN ASC2B_CON:FAR EXTRN B2ASC_CON:FAR PUBLIC TEN STSEG SEGMENT DB 64 DUP (?) STSEG ENDS ;--- DTSEG SEGMENT TEN DW 10

MESSAGE1 DB CR,LF,'Enter a three digit number','$' ORG 20H

NUMBER1 DB 4,?,4 DUP (0) NUMBER2 DB 4,?,4 DUP (0)

ORG 30H

MESSAGE2 DB CR,LF,'The average is ' ASC_AVG DB 5 DUP (20H),'$' DTSEG ENDS

CR EQU 0DH ;EQUATE CR WITH ASCII CODE FOR CARRIAGE RETURN LF EQU 0AH ;EQUATE LF WITH ASCII CODE FOR LINE FEED

;---

CDSEG SEGMENT MAIN PROC FAR

ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG MOV AX,DTSEG

MOV DS,AX

MOV AX,0600H ;clear the screen MOV BH,07

MOV CX,0000 MOV DX,184FH

INT 10H

MOV AH,09 ;prompt for the first number MOV DX,OFFSET MESSAGE1

INT 21H

MOV AH,0AH ;get the first number MOV DX,OFFSET NUMBER1

INT 21H

MOV AH,09 ;prompt for the second number MOV DX,OFFSET MESSAGE1

INT 21H

MOV AH,0AH ;get the second number MOV DX,OFFSET NUMBER2

INT 21H

;SI and BX must be set up for ASC2B_CON

MOV SI,OFFSET NUMBER1 + 2 ;SI points to beginning of ASCII string SUB BH,BH ;BX = string length - 1

MOV BL,BYTE PTR [SI-1] DEC BX

CALL ASC2B_CON ;convert number 1 to hex MOV CX,AX ;save number1 in CX

MOV SI,OFFSET NUMBER2 + 2 ;SI points to beginning of ASCII string SUB BH,BH ;BX = string length - 1

MOV BL,BYTE PTR [SI-1]

DEC BX

CALL ASC2B_CON ;convert number 2 to hex ADD AX,CX ;add the numbers

SHR AX,1 ;divide by 2

MOV SI,OFFSET ASC_AVG ;SI points to

CALL B2ASC_CON ;convert AX to ASCII MOV AH,09 ;display average MOV DX,OFFSET MESSAGE2

INT 21H MOV AH,4CH

INT 21H ;go back to DOS MAIN ENDP

CDSEG ENDS

END MAIN

TITLE B2ASC BINARY TO DECIMAL CONVERSION MODULE PAGE 60,132

;this module converts a binary (hex) number up to FFFFH to decimal ; then makes it displayable (ASCII)

;CALLING PROGRAM SETS

; AX = BINARY VALUE TO BE CONVERTED TO ASCII

; SI = OFFSET ADDRESS WHERE ASCII VALUE TO BE STORED PUBLIC B2ASC_CON

CDSEG SEGMENT PARA PUBLIC 'CODE' B2ASC_CON PROC FAR

ASSUME CS:CDSEG

PUSHF ;STORE REGS CHANGED BY THIS MODULE PUSH BX

PUSH DX

MOV BX,10 ;BX=10 THE DIVISOR

ADD SI,4 ;SI POINTS TO LAST ASCII DIGIT B2A_LOOP: SUB DX,DX ;DX MUST BE 0 IN WORD DIVISION DIV BX ;DIVIDE HEX NUMBER BY 10 (BX=10) OR DL,30H ;TAG '3' TO REMAINDER TO MAKE IT ASCII MOV [SI],DL ;MOVE THE ASCII DIGIT

DEC SI ;DECREMENT POINTER

CMP AX,0 ;CONTINUE LOOPING WHILE AX 0 JA B2A_LOOP

POP DX ;RESTORE REGISTERS POP BX POPF RET B2ASC_CON ENDP CDSEG ENDS END

TITLE ASC2B ASCII TO BINARY CONVERSION MODULE PAGE 60,132

;this module converts any ASCII number between 0 to 65535 to binary ;CALLING PROGRAM SETS SI = OFFSET OF ASCII STRING

; BX = STRING LENGTH - 1 (USED AS INDEX INTO ASCII NUMBER) ;THIS MODULE SETS AX = BINARY NUMBER

;---

EXTRN TEN:WORD PUBLIC ASC2B_CON

CDSEG SEGMENT PARA PUBLIC 'CODE' ASC2B_CON PROC FAR

ASSUME CS:CDSEG

PUSHF ;STORE REGS CHANGED IN THIS MODULE PUSH DI

PUSH CX

SUB DI,DI ;CLEAR DI FOR THE BINARY(HEX) RESULT MOV CX,1 ;CX = WEIGHT FACTOR

A2B_LOOP: MOV AL,[SI+BX] ;GET THE ASCII DIGIT AND AL,0FH ;STRIP OFF '3'

SUB AH,AH ;CLEAR AH FOR WORD MULTIPLICATION MUL CX ;MULTIPLY BY THE WEIGHT

ADD DI,AX ;ADD IT TO BINARY (HEX) RESULT MOV AX,CX ;MULTIPLY THE WEIGHT FACTOR MUL TEN ; BY TEN

MOV CX,AX ; FOR NEXT ITERATION DEC BX ;DECREMENT DIGIT POINTER JNS A2B_LOOP ;JUMP IF OFFSET 0

MOV AX,DI ;STORE BINARY NUMBER IN AX POP CX ;RESTORE FLAGS

POP DI POPF RET ASC2B_CON ENDP CDSEG ENDS END

10. The program follows: TITLE PROB10 PAGE 60,132 EXTRN SUBPROG1:FAR EXTRN SUBPROG2:FAR PUBLIC PRODUCT PUBLIC QUOTIENT ;---

STSEG SEGMENT PARA STACK 'STACK' DB 100 DUP(?)

STSEG ENDS

DTSEG SEGMENT PARA 'DATA' VALUE1 DW 1228 VALUE2 DW 52400 PRODUCT DW 2 DUP (?) QUOTIENT DW (?) REMAINDER DW (?) DTSEG ENDS

CODSG_A SEGMENT PARA 'CODE' MAIN PROC FAR

ASSUME CS:CODSG_A,DS:DTSEG,SS:STSEG MOV AX,DTSEG

MOV DS,AX

PUSH VALUE1 PUSH VALUE2

CALL SUBPROG1 ;CALL SUBPROG TO MUL VALUE1 * VALUE2 PUSH VALUE1

PUSH VALUE2

CALL SUBPROG2 ;CALL SUBPROG TO DIV VALUE2 / VALUE1 MOV AH,4CH

INT 21H ;GO BACK TO DOS MAIN ENDP

CODSG_A ENDS

END MAIN

;THIS PROGRAM MULTIPLIES TWO EXTERNALLY DEFINED WORDS ;AND STORES THE PRODUCT IN AN EXTERNALLY DEFINED DWORD

TITLE SUBPROG1 PROGRAM TO MULTIPLY TWO WORDS PAGE 60,132

EXTRN PRODUCT:WORD PUBLIC SUBPROG1

CODSG_C SEGMENT PARA 'CODE' SUBPROG1 PROC FAR

ASSUME CS:CODSG_C

PUSH BP ;save SP

MOV BP,SP ;set up BP to access stack MOV AX,[BP]+8 ;get VALUE1

MOV CX,[BP]+6 ;get VALUE2 SUB BX,BX ;initialize carry count MUL CX ;mul value1 * value2 MOV PRODUCT,AX ;store product

MOV PRODUCT+2,DX ;store upper word or product

POP BP ;restore BP

RET 4

CODSG_C ENDS

END

;THIS PROGRAM DIVIDES TWO EXTERNALLY DEFINED WORDS ;AND STORES THE QUOTIENT IN AN EXTERNALLY DEFINED WORD TITLE SUBPROG2 PROGRAM TO ADD TWO WORDS

PAGE 60,132

EXTRN QUOTIENT:WORD

EXTRN REMAINDER:WORD

PUBLIC SUBPROG2 CODSG_B SEGMENT PARA 'CODE' SUBPROG2 PROC FAR

ASSUME CS:CODSG_B

PUSH BP ;save BP

MOV BP,SP ;set up BP to access stack MOV AX,[BP]+6 ;move VALUE2 to AX MOV BX,[BP]+8 ;move VALUE1 to BX SUB DX,DX ;INITIALIZE REM DIV BX ;divide VALUE2/VALUE1

MOV QUOTIENT,AX ;store quotient MOV REMAINDER,DX ;store remainder

POP BP ;restore BP

RET 4

SUBPROG2 ENDP CODSG_B ENDS

CHAPTER 8: 32-BIT PROGRAMMING FOR x86

In document Solutions Mazidi - x86 5e - IRM (Page 51-57)

Related documents