na MOV DL,01 ;Diskovod B INT 13H ;Vypolnit' vvod CMP AH,00 ;Oshibka chteniya? JZ F90 ; net - vyjti MOV ENDCDE,01 ; da: CALL X10ERR ; oshibka chteniya F90: INC CURADR ;Uvelichit' nomer sektora RET F10READ ENDP ; Vyvod sektora na ekran: ; ---------------------- G10DISP PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer ustrojstva MOV CX,512 ;Dlina LEA DX,RECDIN INT 21H RET G10DISP ENDP ; Ochistka ekrana: ; -------------- Q10SCR PROC NEAR MOV AX,0600H ;Polnyj ekran MOV BH,1EH ;Ustanovit' cvet MOV CX,0000 ;Funkciya prokrutki MOV DX,184FH INT 10H RET Q10SCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 ;Funkciya ustanovki MOV BH,00 ; kursora MOV DX,0000 INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke na diske: ; ---------------------------------- X10ERR PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BH,01 ;Nomer ustrojstva MOV CX,18 ;Dlina soobshcheniya LEA DX,READMSG INT 21H RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 134 TITLE PRTNAME (COM) Vvod i pechat' imen CODESG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ----------------------------------------------------- NAMEPAR LABEL BYTE ;Spisok parametrov MAXNLEN DB 20 ; maksimal'naya dlina imeni NAMELEN DB ? ; dlina vvedennogo imeni NAMEFLD DB 20 DUP(' ') ; vvedennoe imya ;Stroka zagolovka: HEADG DB 'List of Employee Names Page ' PAGECTR DB '01',0AH,0AH FFEED DB 0CH ;Perevod stranicy LFEED DB 0AH ;Perevod stroki LINECTR DB 01 PROMPT DB 'Name? ' ; ----------------------------------------------------- MAIN PROC NEAR CALL Q10CLR ;Ochistit' ekran CALL M10PAGE ;Ustanovka nomera stranicy A2LOOP: MOV DX,0000 ;Ustanovit' kursor v 00,00 CALL Q20CURS CALL D10INPT ;Vvesti imya CALL Q10CLR CMP NAMELEN,00 ;Imya vvedeno? JE A30 ; esli net - vyjti, CALL E10PRNT ; esli da - podgotovit' ; pechat' JMP A20LOOP A30: MOV CX,01 ;Konec raboty: LEA DX,FFEED ; odin simvol CALL P10OUT ; dlya progona stranicy, RET ; vozvrat v DOS MAIN ENDP ; Vvod imeni s klaviatury: ; ----------------------- D10INPT PROC NEAR MOV AH,40H ;Funkciya MOV BX,01 ; vyvoda na ekran MOV CX,05 ; 5 simvolov LEA DX,PROMPT INT 21H ;Vyzov DOS MOV AH,0AH ;Funkciya vvoda s klaviatury LEA DX,NAMEPAR INT 21H ;Vyzov DOS RET D10INPT ENDP ; Podgotovka dlya pechati: ; ---------------------- Assembler dlya IBM PC. Programmy. 135 E10PRNT PROC NEAR CMP LINECTR,60 ;Konec stranicy? JB E20 ; net - obojti CALL M10PAGE ; da - pechatat' zagolovok E20: MOV CH,00 MOV CL,NAMELEN ;CHislo simvolov v imeni LEA DX,NAMEFLD ;Adres imeni CALL P10OUT ;Pechatat' imya MOV CX,01 ;Odin LEA DX,LFEED ; perevod stroki CALL P10OUT INC LINECTR ;Uvelichit' schetchik strok E10PRNT ENDP ; Podprogramma pechati zagolovka: ; ----------------------------- M10PAGE PROC NEAR CMP WORD PTR PAGECTR,3130H ;Pervaya stranica? JE M30 ; da - obojti MOV CX,01 ; LEA DX,FFEED ; net -- CALL P10OUT ; perevesti stranicu, MOV LINECTR,03 ; ustanovit' schetchik strok M30: MOV CX,36 ;Dlina zagolovka LEA DX,HEADG ;Adres zagolovka M40: CALL P10OUT INC PAGECTR+1 ;Uvelichit' schetchik stranic CMP PAGECTR+1,3AH ;Nomer stranicy = shest.xx3A? JNE M50 ; net - obojti, MOV PAGECTR+1,30H ; da - perevesti v ASCII INC PAGECTR M50: RET M10PAGE ENDP ; Podprogramma pechati: ; ------------------- P10OUT PROC NEAR ;CX i DX ustanovleny MOV AH,40H ;Funkciya pechati MOV BX,04 ;Nomer ustrojstva INT 21H ;Vyzov DOS RET P10OUT ENDP ; Ochistka ekrana: ; -------------- Q10CLR PROC NEAR MOV AX,0600H ;Funkciya prokrutki MOV BH,60H ;Cvet (07 dlya ch/b) MOV CX,0000 ;Ot 00,00 MOV DX,184FH ; do 24,79 INT 10H ;Vyzov BIOS RET Q10CLR ENDP ; Ustanovka kursora (stroka/stolbec): Assembler dlya IBM PC. Programmy. 136 ; ---------------------------------- Q20CURS PROC NEAR ;DX uzhe ustanovlen MOV AH,02 ;Funkciya ustanovki kursora MOV BH,00 ;Stranica | 0 INT 10H ;Vyzov BIOS RET Q20CURS ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 137 TITLE PRINASK (COM) CHtenie i pechat' diskovyh zapisej CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN JMP MAIN ; --------------------------------------------------------- PATHPAR LABEL BYTE ;Spisok parametrov dlya MAXLEN DB 32 ; vvoda NAMELEN DB ? ; imeni fajla FILENAM DB 32 DUP(' ') SECTOR DB 512 DUP(' ') ;Oblast' vvoda dlya fajla DISAREA DB 120 DUP(' ') ;Oblast' vyvoda COUNT DW 00 ENDCDE DW 00 FFEED DB 0CH HANDLE DW 0 OPENMSG DB '*** Open error ***' PROMPT DB 'Name of file? ' ; ---------------------------------------------------------- MAIN PROC NEAR ;Osnovnaya programma CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor A10LOOP: MOV ENDCDE,00 ;Nachal'naya ustanovka CALL C10PRMP ;Poluchit' imya fajla CMP NAMELEN,00 ;Est' zapros? JE A90 ; net - vyjti CALL E10OPEN ;Otkryt' fajl, ; ustanovit' DTA CMP ENDCDE,00 ;Oshibka pri otkrytii? JNE A80 ; da - povtorit' zapros CALL R10READ ;Prochitat' pervyj sektor CMP ENDCDE,00 ;Konec fajla, net dannyh? JE A80 ; da - povtorit' zapros CALL G10XPER ;Raspechatat' sektor A80: JMP A10LOOP A90: RET MAIN ENDP ; Podprogramma zaprosa imeni fajla: ; -------------------------------- C10PRMP PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 MOV CX,13 LEA DX,PROMPT INT 21H MOV AH,0AH ;Funkciya vvoda s klaviatury LEA DX,PATHPAR INT 21H MOV BL,NAMELEN ;Zapisat' MOV BH,00 ; 00 v konec Assembler dlya IBM PC. Programmy. 138 MOV FILENAM[BX],0 ; imeni fajla C90 RET C10PRMP ENDP ; Otkrytie diskovogo fajla: ; ------------------------ E10OPEN PROC NEAR MOV AH,3DH ;Funkciya otkrytiya MOV AL,00 ;Tol'ko chtenie LEA DX,FILENAM INT 21H JNC E20 ;Proverit' flag CF CALL X10ERR ; oshibka, esli ustanovlen RET E20: MOV HANDLE,AX ;Sohranit' nomer fajla MOV AX,2020H MOV CX,256 ;Ochistit' probelami REP STOSW ; oblast' sektora RET E100PEN ENDP ; Podgotovka i pechat' dannyh: ; -------------------------- G10XFER PROC NEAR CLD ;Napravlenie sleva-napravo LEA SI,SECTOR ;Nachal'naya ustanovka G20: LEA DI,DISAREA MOV COUNT,00 G30: LEA DX,SECTOR+512 CMP SI,DX ;Konec sektora? JNE G40 CALL R10READ ; da - chitat' sleduyushchij CMP ENDCDE,00 ;Konec fajla? JE G80 ; da - vyjti LEA SI,SECTOR G40: MOV BX,COUNT CMP BX,80 ;Konec oblasti vyvoda? JB G50 ; net - obojti MOV [DI+BX],0D0AH ; da - zapisat' CR/LF CALL P10PRNT LEA DI,DISAREA ;Nachalo oblasti vyvoda G50: LODSB ;Zapisat' [SI] v AL, ; uvelichit' SI MOV BX,COUNT MOV [DI+BX],AL ;Zapisat' simvol INC BX CMP AL,1AH ;Konec fajla? JE G80 ; da - vyjti CMP AL,0AH ;Konec stroki? JNE G60 ; net - obojti, Assembler dlya IBM PC. Programmy. 139 CALL P10PRNT ; da - pechatat' JMP G20 G60: CMP AL,09H ;Simvol tabulyacii? JNE G70 DEC BX ; da - ustanovit' BX: MOV BYTE PTR [DI+BX],20H ;Zamenit TAB na probel AND BX,0FFF8H ;Obnulit' pravye 8 bit ADD BX,08 ; i pribavit' 8 G70: MOV COUNT,BX JMP G30 G80: MOV BX,COUNT ;Konec fajla MOV BYTE PTR [DI+BX],0CH ;Progon stranicy CALL P10PRNT ;Pechatat' poslednyuyu stroku G90: RET G10XFER ENDP ; Podprogrammy pechati: ; ------------------- P10PRNT PROC NEAR MOV AH,40H ;Funkciya pechati MOV BX,04 MOV CX,COUNT ;Dlina INC CX LEA DX,DISAREA INT 21H MOV AX,2020H ;Ochistit' oblast' vyvoda MOV CX,60 LEA DI,DISAREA REP STOSW RET P10PRNT ENDP ; Podprogramma chteniya sektora: ; --------------------------- R10READ PROC NEAR MOV AH,3FH ;Funkciya chteniya MOV BX,HANDLE ;Nomer fajla MOV CX,512 ;Dlina MOV DX,SECTOR ;Bufer INT 21H MOV ENDCDE,AX RET R10READ ENDP ; Prokrutka ekrana: ; ---------------- Q10SCR PROC NEAR MOV AX,0600H MOV BH,1EH ;Ustanovit' cvet MOV CX,0000 ;Prokrutka (sskrolling) MOV DX,184FH INT 10H RET Q10SCR ENDP Assembler dlya IBM PC. Programmy. 140 ; Podprogramma ustanovki kursora: ; ------------------------------ Q20CURS PROC NEAR MOV AH,02 ;Funkciya ustanovki MOV BH,00 ; kursora MOV DX,00 INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke: ; ------------------------- X10ERR PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer MOV CX,18 ;Dlina LEA DX,OPENMSG ;Adres soobshcheniya INT 1H MOV NDCDE,01 ;Priznak oshibki RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 141 TITLE MACRO1 (EXE) Makros dlya inicializacii ; -------------------------------------------- INIT1 MACRO ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG PUSH DS SUB AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX ENDM ;Konec makrokomandy ; -------------------------------------------- 0000 STACK SEGMENT PARA STACK 'Stack' 0000 20 [ ???? ] DW 32 DUP(?) 0040 STACK ENDS ; -------------------------------------------- 0000 DSEG SEGMENT PARA 'Data' 0000 54 65 73 74 20 6F MESSGE DB 'Test of macro-instruction', 13 66 20 6D 61 63 72 6F 2D 69 6E 73 74 72 65 73 74 69 6F 6E 0D 001A DSEG ENDS ; -------------------------------------------- 0000 CSEG SEGMENT PARA 'Code' 0000 BEGIN PROC FAR INIT1 ;Makrokomanda 0000 1E + PUSH DS 0001 2B C0 + SUB AX,AX 0003 50 + PUSH AX 0004 B8 ---- R + MOV AX,DSEG 0007 8E D8 + MOV DS,AX 0009 8E C0 + MOV ES,AX 000B B4 40 MOV AH,40H ;Vyvod na ekran 000D BB 0001 MOV BX,01 ;Nomer 0010 B9 001A MOV CX,26 ;Dlina 0013 8D 16 0000 R LEA DX,MESSGE ;Soobshchenie 0017 CD 21 INT 21H 0019 CB RET 001A BEGIN ENDP 001A CSEG ENDS END BEGIN Macros: N a m e Length INIT1. . . . . . . . . . . . . . . . 0004 Segments and Groups: N a m e Size Align Combine Class CSEG . . . . . . . . . . . . . . . . 001A PARA NONE 'CODE' DSEG . . . . . . . . . . . . . . . . 001A PARA NONE 'DATA' STACK. . . . . . . . . . . . . . . . 0040 PARA STACK 'STACK' Assembler dlya IBM PC. Programmy. 142 Symbols: N a m e Type Value Attr BEGIN. . . . . . . . . . . . . . . . F PROC 0000 CSEG Length=001A MESSAGE. . . . . . . . . . . . . . . L BYTE 0000 DSEG Assembler dlya IBM PC. Programmy. 143 TITLE MACRO2 (EXE) Ispol'zovanie parametrov ; ------------------------------------------------ INIT2 MACRO CSNAME,DSNAME,SSNAME ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM ;Konec makrokomandy ; ------------------------------------------------ 0000 STACK SEGMENT PARA STACK 'Stack' 0000 20 [ ???? ] DW 32 DUP(?) 0040 STACK ENDS ; ------------------------------------------------ 0000 DSEG SEGMENT PARA 'Data' 0000 54 65 73 74 20 6F MESSAGE DB 'Test of macro', '$' 66 20 6D 61 63 72 6F 24 000E DSEG ENDS ; ------------------------------------------------ 0000 CSEG SEGMENT PARA 'Code' 0000 BEGIN PROC FAR INIT2 CSEG,DSEG,STACK 0000 1E + PUSH DS 0001 2B C0 + SUB AX,AX 0003 50 + PUSH AX 0004 B8 ---- R + MOV AX,DSEG 0007 8E D8 + MOV DS,AX 0009 8E C0 + MOV ES,AX 000B B4 09 MOV AH,09 ;Vyvod na ekran 000D 8D 16 0000 R LEA DX,MESSGE ;Soobshchenie 0011 CD 21 INT 21H 0013 CB RET 0014 BEGIN ENDP 0014 CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 144 TITLE MACRO3 (EXE) Direktivy .LALL i .SALL ; ------------------------------------------------ INIT2 MACRO CSNAME,DSNAME,SSNAME ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM ; ------------------------------------------------ PROMPT MACRO MESSAGE ; Makrokomanda vyvodit na ekran lyubye soobshcheniya ;; Generiruet komandy vyzova DOS MOV AH,09 ;Vyvod na ekran LEA DX,MESSAGE INT 21H ENDM ; ------------------------------------------------ 0000 STACK SEGMENT PARA STACK 'Stack' 0000 20 [ ???? ] DW 32 DUP (?) 0040 STACK ENDS ; ------------------------------------------------ 0000 DATA SEGMENT PARA 'Data' 0000 43 75 73 74 6F 6D MESSG1 DB 'Customer name?', '$' 65 72 20 6E 61 6D 65 3F 24 000F 43 75 73 74 6F 6D MESSG2 DB 'Customer address?', '$' 65 72 20 61 64 64 72 65 73 73 3F 24 0021 DATA ENDS ; ------------------------------------------------ 0000 CSEG SEGMENT PARA 'Code' 0000 BEGIN PROC FAR .SALL INIT2 CSEG,DATA,STACK PROMPT MESSG1 .LALL PROMPT MESSG2 + ; Makrokomanda vyvodit na ekran lyubye soobshcheniya 0013 B4 09 + MOV AH,09 ;Vyvod na ekran 0015 8D 16 000F R + LEA DX,MESSG2 0019 CD 21 + INT 21H 001B CB RET 001C BEGIN ENDP 001C CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 145 TITLE MACRO4 (COM) Ispol'zovanie direktivy LOCAL ; ------------------------------------------------- DIVIDE MACRO DIVIDEND,DIVISOR,QUOTIENT LOCAL COMP LOCAL OUT ; AX=delimoe, BX=delitel', CX=chastnoe MOV AX,DIVIDEND ;Zagruzit' delimoe MOV BX,DIVISOR ;Zagruzit' delitel' SUB CX,CX ;Registr dlya chastnogo COMP: CMP AX,BX ;Delimoe < delitelya? JB OUT ; da - vyjti SUB AX,BX ;Delimoe - delitel' INC CX ;CHastnoe + 1 JMP COMP OUT: MOV QUOTIENT,CX ;Zapisat' rezul'tat ENDM ; ------------------------------------------------ 0000 CSEG SEGMENT PARA 'Code' ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG 0100 ORG 100H 0100 EB 06 BEGIN: JMP SHORT MAIN ; ------------------------------------------------ 0102 0096 DIVDND DW 150 ;Delimoe 0104 001B DIVSOR DW 27 ;Delitel' 0106 ???? QUOTNT DW ? ;CHastnoe ; ------------------------------------------------ 0108 MAIN PROC NEAR .LALL DIVIDE DIVDND,DIVSOR,QUOTNT + ; AX=delimoe, BX=delitel', CX=chastnoe 0108 A1 0102 R + MOV AX,DIVDND ;Zagruzit' delimoe 010B 8B 1E 0104 R + MOV BX,DIVSOR ;Zagruzit' delitel' 010F 2B C9 + SUB CX,CX ;Registr dlya chastnogo 0111 + ??0000: 0111 3B C3 + CMP AX,BX ;Delimoe < delitelya? 0113 72 05 + JB ??0001 ; da - vyjti 0115 2B C3 + SUB AX,BX ;Delimoe - delitel' 0117 41 + INC CX ;CHastnoe + 1 0118 EB F7 + JMP ??0000 011A + ??0001: 011A 89 0E 0106 R + MOV QUOTNT,CX ;Zapisat' rezul'tat 011E C3 RET 011F MAIN ENDP 011F CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 146 TITLE MACRO5 (EXE) Proverka direktivy INCLUDE EDIF ; ------------------------------------------------ 0000 STACK SEGMENT PARA STACK 'Stack' 0000 20 [????] DW 32 DUP(?) 0040 STACK ENDS ; ------------------------------------------------ 0000 DATA SEGMENT PARA 'Data' 0000 54 65 73 74 20 6F MESSGE DB 'Test of macro','$' 66 20 6D 61 63 72 6F 24 000E DATA ENDS ; ------------------------------------------------ 0000 CSEG SEGMENT PARA 'Code' 0000 BEGIN PROC FAR INIT CSEG,DATA,STACK 0000 1E + PUSH DS 0001 3B C0 + SUB AX,AX 0003 50 + PUSH AX 0004 B8 ---- R + MOV AX,DATA 0007 8E D8 + MOV DS,AX 0009 8E C0 + MOV ES,AX PROMPT MESSGE 000B B4 09 + MOV AH,09 ;Vyvod na ekran 000D 8D 16 0000 R + LEA DX,MESSGE 0011 CD 21 + INT 21H 0013 CB RET 0014 BEGIN ENDP 0014 CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 147 TITLE MACRO6 (COM) Proverka dirktiv IF i IFNDEF ; ------------------------------------------------ DIVIDE MACRO DIVIDEND,DIVISOR,QUOTIENT LOCAL COMP LOCAL OUT CNTR = 0 ; AX-delimoe, BX-delitel', CX-chastnoe IFNDEF DIVIDEND ; Delitel' ne opredelen CNTR = CNTR +1 ENDIF IFNDEF DIVISOR ; Delimoe ne opredeleno CNTR = CNTR +1 ENDIF IFNDEF QUOTIENT ; CHastnoe ne opredeleno CNTR = CNTR +1 ENDIF IF CNTR ; Makrorasshirenie otmeneno EXITM ENDIF MOV AX,DIVIDEND ;Zagruzka delimogo MOV BX,DIVISOR ;Zagruzka delitelya SUB CX,CX ;Registr dlya chastnogo COMP: CMP AX,BX ;Delimoe < delitelya? JB OUT ; da - vyjti SUB AX,BX ;Delimoe - delitel' INC CX ;CHastnoe + 1 JMP COMP OUT: MOV QUOTIENT,CX ;Zapis' rezul'tata ENDM ; ------------------------------------------------ 0000 CSEG SEGMENT PARA 'Code' ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG 0100 ORG 100H 0100 EB 06 BEGIN: JMP SHORT MAIN ; ------------------------------------------------ 0102 0096 DIVDND DW 150 0104 001B DIVSOR DW 27 0106 ???? QUOTNT DW ? ; ------------------------------------------------ 0108 MAIN PROC NEAR .LALL DIVIDE DIVDND,DIVSOR,QUOTNT = 0000 + CNTR = 0 + ; AX-delimoe, BX-delitel', CX-chastnoe + ENDIF + ENDIF Assembler dlya IBM PC. Programmy. 148 + ENDIF + ENDIF 0108 A1 0102 R + MOV AX,DIVDND ;Zagruzka delimogo 0108 8B 1E 0104 R + MOV BX,DIVSOR ;Zagruzka delitelya 010F 2B C9 + SUB CX,CX ;Registr dlya chastnogo 0111 + ??0000: 0111 3B C3 + CMP AX,BX ;Delimoe < delitelya? 0113 72 05 + JB ??0001 ; da - vyjti 0115 2B C3 + SUB AX,BX ;Delimoe - delitel' 0117 41 + INC CX 0118 EB F7 + JMP ??0000 011A + ??0001: 011A 89 0E 0106 R + MOV QUOTNT,CX ;Zapis' rezul'tata DIVIDE DIDND,DIVSOR,QUOT = 0000 + CNTR = 0 + ; AX-delimoe, BX-delitel', CX-chastnoe + IFNDEF DIDND + ; Delitel' ne opredelen = 0001 + CNTR = CNTR +1 + ENDIF + ENDIF + IFNDEF QUOT + ; CHastnoe ne opredeleno = 0002 + CNTR = CNTR +1 + ENDIF + IF CNTR + ; Makrorasshirenie otmeneno + EXITM 011E C3 RET 011F MAIN ENDP 011F CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 149 TITLE MACRO7 (COM) Proverka direktivy IFIDN ; -------------------------------------------- MOVIF MACRO TAG IFIDN <&TAG>,<B> REP MOVSB EXITM ENDIF IFIDN <&TAG>,<W> REP MOVSW ELSE ; Ne ukazan parametr B ili W, ; po umolchaniyu prinyato B REP MOVSB ENDIF ENDM ; -------------------------------------------- 0000 CSIG SEGMENT PARA 'Code' ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG 0100 ORG 100H 0100 EB 00 BEGIN: JMP SHORT MAIN ; ... 0102 MAIN PROC NEAR .LALL MOVIF B + IFIDN <B>,<B> 0102 F3/A4 + REP MOVSB + EXITM MOVIF W + ENDIF + IFIDN <W>, <W> 0104 F3/A5 + REP MOVSW + ENDIF MOVIF + ENDIF + ELSE + ; Ne ukazan parametr B ili W, + ; po umolchaniyu prinyato B 0106 F3/A4 + REP MOVSB + ENDIF 0108 C3 RET 0109 MAIN ENDP 0109 CSEG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 150 +-----------+ +-----------+ | Osnovnaya | | Osnovnaya | | programma | | programma | +-----+-----+ +-----+-----+ | | | | +------------+------------+ +------+------+ | | | | | | | | | | +--------+ +--------+ +--------+ +--------+ +--------+ | P/P 1 | | P/P 2 | | P/P 3 | | P/P 1 | | P/P 2 | +---------+ +---------+ +---------+ +----+----+ +---------+ | | +--------+ | P/P 3 | +---------+ Assembler dlya IBM PC. Programmy. 151 +---------------------------------------+ | EXTRN SUBPROG:FAR | | MAINPROG: . | | . | | CALL SUBPROG | | . | | . | +---------------------------------------+ | PUBLIC SUBPROG | | SUBPROG: . | | . | | . | | RET | +---------------------------------------+ Assembler dlya IBM PC. Programmy. 152 page 60,132 TITLE CALLMULL1 (EXE) Vyzov podprogrammy umnozheniya EXTRN SUBMUL:FAR ;----------------------------------------------- 0000 STACKSG SEGMENT PARA STACK 'Stack' 0000 40 [ ???? ] DW 64 DUP(?) 0080 STACKSG ENDS ;----------------------------------------------- 0000 DATASG SEGMENT PARA 'Data' 0000 0140 QTY DW 0140H 0002 2500 PRICE DW 2500H 0004 DATASG ENDS ;----------------------------------------------- 0000 CODESG SEGMENT PARA 'Code' 0000 BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG 0000 1E PUSH DS 0001 2B C0 SUB AX,AX 0003 50 PUSH AX 0004 B8 ---- R MOV AX,DATASG 0007 8E D8 MOV DS,AX 0009 A1 0002 R MOV AX,PRICE ;Zagruzit' stoimost' 000C 8B 1E 0000 R MOV BX,QTY ; i kolichestvo 0010 9A 0000 ---- E CALL SUBMUL ;Vyzvat' podprogrammu 0015 CB RET 0016 BEGIN ENDP 0016 CODESG ENDS END BEGIN Segments and Groups: N a m e Size Align Combine Class CODESG . . . . . . . . . . . . 0016 PARA NONE 'CODE' DATASG . . . . . . . . . . . . 0004 PARA NONE 'DATA' STACKSG. . . . . . . . . . . . 0080 PARA STACK 'STACK' Symbols: N a m e Type Value Attr BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0016 PRICE. . . . . . . . . . . . . L WORD 0002 DATASG QTY. . . . . . . . . . . . . . L WORD 0000 DATASG SUBMUL . . . . . . . . . . . . L FAR 0000 External page 60,132 TITLE SUBMUL Podprogramma dlya umnozheniya ;----------------------------------------------- 0000 CODESG SEGMENT PARA 'Code' 0000 SUBMUL PROC FAR ASSUME CS:CODESG PUBLIC SUBMUL 0000 F7 E3 MUL BX ;AX-stoimost', BX-kolichestvo 0002 CB RET ;Proizvedenie v DX:AX Assembler dlya IBM PC. Programmy. 153 0003 SUBMUL ENDP 0003 CODESG ENDS END SUBMUL Segments and groups: N a m e Size Align Combine Class CODESG . . . . . . . . . . . . 0003 PARA NONE 'CODE' Symbols: N a m e Type Value Attr SUBMUL . . . . . . . . . . . . F PROC 0000 CODESG Clobal Length=0003 LINK IBM Personal Computer Linker Version 2.30 (C) Copyright IBM Corp 1981, 1985 Object Modules: B:CALLMUL1+B:SUBMUL1 Run File: [B:CALLMUL1.EXE]: <return> List File:[NUL.MAP]: CON Libraries [.LIB]: <return> Start Stop Length Name Class 00000H 00015H 0016H CODESG CODE <--Primechanie: 2 kodovyh 00020H 00022H 0003H CODESG CODE <-- segmenta 00030H 00033H 0004H DATASG DATA 00040H 000BFH 0080H STACKSG STACK Program entry point at 0000:0000 Assembler dlya IBM PC. Programmy. 154 page 60,132 TITLE CALLMUL2 (EXE) Vyzov podprogrammy umnozheniya EXTERN SUBMUL:FAR ;---------------------------------------------- 0000 STACKSG SEGMENT PARA STACK 'Stack' 0000 40 [????] DW 64 DUP(?) 0080 STACKSG ENDS ;---------------------------------------------- 0000 DATASG SEGMENT PARA 'Data' 0000 0140 QTY DW 0140H 0002 2500 PRICE DW 2500H 0004 DATASG ENDS ;---------------------------------------------- 0000 CODESG SEGMENT PARA PUBLIC 'Code' 0000 BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG 0000 1E PUSH DS 0001 2B C0 SUB AX,AX 0003 50 PUSH AX 0004 B8 ---- R MOV AX,DATASG 0007 8E D8 MOV DS,AX 0009 A1 0002 R MOV AX,PRICE ;Zagruzit' stoimost' 000C 8B 1E 0000 R MOV BX,QTY ; i kolichestvo 0010 9A 0000 ---- E CALL SUBMUL ;Vyzvat' podprogrammu 0015 CB RET 0016 BEGIN ENDP 0016 CODESG ENDS END BEGIN Segments and Group: N a m e Size Align Combine Class CODESG . . . . . . . . . . . . .0016 PARA PUBLIC 'CODE' DATASG . . . . . . . . . . . . .0004 PARA NONE 'DATA' STACKSG. . . . . . . . . . . . .0080 PARA STACK 'STACK' Symbols: N a m e Type Value Attr BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Lenght=0016 PRICE. . . . . . . . . . . . . L WORD 0002 DATASG QTY. . . . . . . . . . . . . . L WORD 0000 DATASG SUBMUL . . . . . . . . . . . . L FAR 0000 External page 60,132 TITLE SUBMUL2 Vyzyvaemaya podprogramma umnozheniya ;---------------------------------------------- 0000 CODESG SEGMENT PARA PUBLIC 'CODE' 0000 SUBMUL PROC FAR ASSUME CS:CODESG PUBLIC SUBMUL 0000 F7 E3 MUL BX ;AX-stoimost', BX-kolichestvo Assembler dlya IBM PC. Programmy. 155 0002 CB RET ;Proizvedenie v DX:AX 0003 SUBMUL ENDP 0003 CODESG ENDS END SUBMUL Segments and Groups: N a m e Size Align Combine Class CODESG. . . . . . . . . . . . . 0003 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr SUBMUL. . . . . . . . . . . . .F PROC 0000 CODESG Global Length=0003 LINK IBM Personal Computer Linker Version 2.30 (C) Copyright IBM Corp 1981, 1985 Object Modules: B:CALLMUL2+B:SUBMUL2 Run File: [B:CALLMUL2.EXE]: <return> List