Assembler dlya IBM PC. Programmy. 35 page 60,132 TITLE STRING (EXE) Proverka strokovyh operacij ; --------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKG ENDS ; --------------------------------------------------- DATASG SEGMENT PARA 'Data' NAME1 DB 'Assemblers' ;|lementy dannyh NAME2 DB 10 DUP(' ') NAME3 DB 10 DUP(' ') DATASG ENDS ; --------------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ;Osnovnaya procedura ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX CALL C10MVSB ;Podprogramma MVSB CALL D10MVSW ;Podprogramma LODS CALL E10LODS ;Podprogramma LODS CALL F10STOS ;Podprogramma CMPS CALL H10SCAS ;Podprogramma SCAS RET BEGIN ENDP ; Ispol'zovanie MOVSB: ; ------------------- C10MVSB PROC NEAR CLD LEA SI,NAME1 LEA D1,NAME2 MOV CX,10 ;Pereslat' 10 bajtov REP MOVSB ; iz NAME1 v NAME2 RET C10MVSB ENDP ; Ispol'zovanie MOVSW: ; ------------------- D10MVSW PROC NEAR CLD LEA SI,NAME2 LEA DI,NAME3 MOV CX,05 ;Pereslat' 5 slov REP MOVSW ; iz NAME2 v NAME3 RET D10MVSW ENDP ; Ispol'zovanie LODSW: ; ------------------- E10LODS PROC NEAR Assembler dlya IBM PC. Programmy. 36 CLD LEA SI,NAME1 ;Zagruzit' pervoe slovo LODSW ; iz NAME1 v AX RET E10LODS ENDP ; Ispol'zovanie STOSW: ; ------------------- F10STOS PROC NEAR CLD LEA D1,NAME3 MOV CX,05 MOV AX,2020H ;Pereslat' probely REP STOSW ; v NAME3 RET F10STOS ENDP ; Ispol'zovanie CMPSB: ; ------------------- G10CMPS PROC NEAR CLD MOV CX,10 LEA SI,NAME1 LEA DI,NAME2 REPE CMPSB ;Sravnit' NAME1 i NAME2 JNE G20 ;Ne ravny? MOV BH,01 G20: MOV CX,10 LEA SI,NAME2 LEA DI,NAME3 REPE CMPSB ;Sravnit' NAME2 i NAME3 JE G30 ;Esli ravny, to vyjti MOV BL,02 G30: RET G10CMPS ENDP ; Ispol'zovanie SCASB: ; ------------------- H10SCAS PROC NEAR CLD MOV CX,10 LEA DI,NAME1 MOV AL,'m' ;Poisk simvola 'm' REPNE SCASB ; v NAME1 JNE H20 ;Esli ne najden - vyjti MOV AH,03 H20: RET H10SCAS ENDP CODES ENDS END BEGIN Assembler dlya IBM PC. Programmy. 37 page 60,132 TITLE EXRING (COM) Vyvod imen, vyrovnennyh sprava CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ;-------------------------------------------------------- NAMEPAR LABEL BYTE ;Imya spiska parametrov MAXNLEN DB 31 ;Maks. dlina ACTNLEN DB ? ;CHislo vvedennyh simvolov NAMEFLD DB 31 DUP(' ') ;Imya PROMPT DB 'Name?', '$' NAMEDSP DB 31 DUP(' '), 13, 10, '$' ROW DB 00 ;-------------------------------------------------------- MAIN PROC NEAR ;Osnovnaya procedura MOV AX,0600H CALL Q10SCR ;Ochistit' ekran SUB DX,DX ;Ustanovit' kursor v 00,00 CALL Q20CURS A10LOOP: CALL B10INPT ;Vvesti imya s klaviatury TEST ACTNLEN,0FFH ;Net imeni? (t.e. konec) JZ A90 ; da - vyjti CALL D10SCAS ;Najti zvezdochku CMP AL,'*' ;Najdena? JE A10LOOP ; da - obojti CALL E10RGHT ;Vyrovnyat' imya sprava CALL A10LOOP A90: RET MAIN ENDP ; Vyvod zaprosa dlya vvoda imeni: ; ----------------------------- B10INPT PROC MOV AH,09 LEA DX,PROMPT ;Vydat' tekst zaprosa INT 21H RET B10INPT ENDP ; Poisk zvezdochki v imeni: ; ----------------------- D10SCAS PROC CLD MOV AL,'*' MOV CX,30 ;Dlina skanirovaniya - 30 LEA DI,NAMEFLD REPNE SCASB ;Zvezdochka najdena? JE D20 ; da - vyjti, MOV AL,20H ; net steret' * v AL D20: RET D10SCAS ENDP Assembler dlya IBM PC. Programmy. 38 ; Vyravnivanie sprava i vyvod na ekran: ; ------------------------------------ E10RGHT PROC STD SUB CH,CH MOV CL,ACTNLEN ;Dlina v CX dlya REP LEA SI,NAMEFLD ;Vychislit' samuyu pravuyu ADD SI,CX ; poziciyu DEC SI ; vvedennogo imeni LEA DI,NAMEDSP+30 ;Pravaya poz. polya imeni REP MOVSB ;Pereslat' sprava nalevo MOV DH,ROW MOV DL,48 CALL Q20CURS ;Ustanovit' kursor MOV AH,09 LEA DX,NAMEDSP ;Vydat' imya na ekran INT 21H CMP ROW,20 ;Poslednyaya stroka ekrana? JAE E20 ; net - INC ROW ; uvelichit' stroku, JMP E90 E20: MOV AX,0601H ; da - CALL Q10SCR ; prokrutit' i MOV DH,ROW ; ustanovit' kursor MOV DL,00 CALL Q20CURS E90: RET E10RGHT ENDP ; Ochistit' oblast' imeni: ; ---------------------- F10CLNM PROC CLD MOV AX,2020H MOV CX,15 ;Ochistit' 15 slov LEA DI,NAMEDSP REP STOSW RET F10CLNM ENDP ; Prokrutka ekrana: ; ---------------- Q10SCR PROC ;AX ustanovlen pri vyzove MOV BH,30 ;Cvet ( 07 dlya ch/b) MOV CX,00 MOV DX,184FH INT 10H RET Q10SCR ENDP ; Ustanovit' kursor (stroka/stolbec): ; ---------------------------------- Q20CURS PROC ;DX ustanovlen pri vyzove MOV AH,02 SUB BH,BH Assembler dlya IBM PC. Programmy. 39 INT 10H RET Q20CURS ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 84 TITLE EXDWMUL - Umnozhenie dvojnyh slov CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; --------------------------------------------- MULTCND DW 3206H ;|lementy dannyh DW 2521H MULTPLR DW 6400H DW 0A26H PRODUCT DW 0 DW 0 DW 0 DW 0 ; --------------------------------------------- MAIN PROC NEAR ;Osnovnaya procedura CALL E10XMUL ;Vyzvat' 1-e umnozhenie CALL Z10ZERO ;Ochistit' proizvedenie CALL F10XMUL ;Vyzvat' 2-e umnozhenie RET MAIN ENDP ; Umnozhenie dvojnogo slova na slovo: ; ----------------------------------------------- E10XMUL PROC MOV AX,MULTCND+2 ;Umnozhit' pravoe slova MUL MULTPLR ; mnozhimogo MOV PRODUCT+4,AX ;Zapisat' proizvedenie MOV PRODUCT+2,DX MOV AX,MULTCND ;Umnozhit' levoe slovo MUL MULTPLR ; mnozhimogo ADD PRODUCT+2,AX ;Slozhit' s poluchennym ranee ADC PRODUCT,DX RET E10XMUL ENDP ; Peremnozhenie dvuh dvojnyh slov: ; -------------------------------------------- F10XMUL PROC MOV AX,MULTCND+2 ;Slovo-2 mnozhimogo MUL MULTPLR+2 ; * slovo-2 mnozhitelya MOV PRODUCT+6,AX ;Sohranit' rezul'tat MOV PRODUCT+4,DX MOV AX,MULTCND+2 ;Slovo-2 mnozhimogo MUL MULTPLR ; * slovo-1 mnozhitelya ADD PRODUCT+4,AX ;Slozhit' s predydushchim ADC PRODUCT+6,DX ADC PRODUCT,00 ;Pribavit' perenos MOV AX,MULTCND ;Slovo-1 mnozhimogo MUL MULTPLR+2 ; * slovo-2 mnozhitelya ADD PRODUCT+4,AX ;Slozhit' s predydushchim Assembler dlya IBM PC. Programmy. 85 ADC PRODUCT+6,DX ADC PRODUCT,00 ;Pribavit' perenos MOV AX,MULTCND ;Slovo-1 mnozhimogo MUL MULTPLR ; * slovo-1 mnozhitelya ADD PRODUCT+2,AX ;Slozhit' s predydushchim ADC PRODUCT,DX RET F10XMUL ENDP ; Ochistka oblasti rezul'tata: ; ---------------------------------------- Z10XMUL PROC MOV PRODUCT,0000 MOV PRODUCT+2,0000 MOV PRODUCT+4,0000 MOV PRODUCT+6,0000 RET Z10XMUL ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 86 page 60,132 TITLE EXDIV (COM) Primer operacij DIV i IDIV CODESG SEGMENT PARA 'Code' ORG 100H BEGIN: JMP SHORT MAIN ; --------------------------------------------- BYTE1 DB 80H ;Data items BYTE2 DB 16H WORD1 DW 2000H WORD2 DW 0010H WORD3 DW 1000H ; --------------------------------------------- MAIN PROC NEAR ;Osnovnaya procedura CALL D10DIV ;Vyzov podprogrammy DIV CALL E10IDIV ;Vyzov podprogrammy IDIV MAIN ENDP ; Primery s komandoj DIV: ; --------------------------------------------- D10DIV PROC MOV AX,WORD1 ;Slovo / bajt DIV BYTE1 ; ostatok:chastnoe v AH:AL MOV AL,BYTE1 ;Bajt / bajt SUB AH,AH ; rasshirit' delimoe v AH DIV BYTE3 ; ostatok:chastnoe v AH:AL MOV DX,WORD2 ;Dvojnoe slovo / slovo MOV AX,WORD3 ; delimoe v DX:AX DIV WORD1 ; ostatok:chastnoe v DX:AX MOV AX,WORD1 ;Slovo / slovo SUB DX,DX ; rasshirit' delimoe v DX DIV WORD3 ; ostatok:chastnoe v DX:AX RET D10DIV ENDP ; Primery s komandoj IDIV: ; --------------------------------------------- E10IDIV PROC MOV AX,WORD1 ;Slovo / bajt IDIV BYTE1 ; ostatok:chastnoe v AH:AL MOV AL,BYTE1 ;Bajt / bajt CBW ; rasshirit' delimoe v AH IDIV BYTE3 ; ostatok:chastnoe v AH:AL MOV DX,WORD2 ;Dvojnoe slovo / slovo MOV AX,WORD3 ; delimoe v DX:AX IDIV WORD1 ; ostatok:chastnoe v DX:AX MOV AX,WORD1 ;Slovo / slovo CWD ; rasshirit' delimoe v DX IDIV WORD3 ; ostatok:chastnoe v DX:AX RET E10DIV ENDP CODESG ENDS Assembler dlya IBM PC. Programmy. 87 END BEGIN TITLE ASCADD (COM) Slozhenie chisel v ASCII-formate CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ----------------------------------------------- ASC1 DB '578' ;|lementy dannyh ASC2 DB '694' ASC3 DB '0000' ; ----------------------------------------------- MAIN PROC NEAR CLC LEA SI,AASC1+2 ;Adresa ASCII-chisel LEA DI,AASC2+2 LEA BX,AASC1+3 MOV CX,03 ;Vypolnit' 3 cikla A20: MOV AH,00 ;Ochistit' registr AH MOV AL,[SI] ;Zagruzit' ASCII-bajt ADC AL,[DI] ;Slozhenie (s perenosom) AAA ;Korrekciya dlya ASCII MOV [BX],AL ;Sohranenie summy DEC SI DEC DI DEC BX LOOP A20 ;Ciklit'sya 3 raza MOV [BX],AH ;Sohranit' perenos RET MAIN ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 88 TITLE ASCMUL (COM) Umnozhenie ASCII-chisel CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP MAIN ; --------------------------------------------- MULTCND DB '3783' ;|lementy dannyh MULTPLR DB '5' PRODUCT DB 5 DUP(0) ; --------------------------------------------- MAIN PROC NEAR MOV CX,04 ;4 cikla LEA SI,MULTCND+3 LEA DI,PRODUCT+4 AND MULTPLR,0FH ;Udalit' ASCII-trojku A20: MOV AL,[SI] ;Zagruzit' ASCII-simvol ; (mozhno LODSB) AND AL,OFH ;Udalit' ASCII-trojku MUL MULTPLR ;Umnozhit' AAM ;Korrekciya dlya ASCII ADD AL,[DI] ;Slozhit' s AAA ; zapisannym MOV [DI],AL ; proizvedeniem DEC DI MOV [DI],AH ;Zapisat' perenos DEC SI LOOP A20 ;Ciklit'sya 4 raza RET MAIN ENDP CODESG ENDS END BEGIN TITLE ASCDIV (COM) Delenie ASCII-chisel CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; --------------------------------------------- DIVDND DB '3698' ;|lementy dannyh DIVSOR DB '4' QUOTNT DB 4 DUP(0) ; --------------------------------------------- MAIN PROC NEAR MOV CX,04 ;4 cikla SUB AH,AH ;Steret' levyj bajt delimogo AND DIVSOR,0FH ;Steret' ASCII 3 v delitele LEA SI,DIVDND LEA DI,QUOTNT A20: Assembler dlya IBM PC. Programmy. 89 MOV AL,[SI] ;Zagruzit' ASCII bajt ; (mozhno LODSB) AND AL,0FH ;Steret' ASCII trojku AAD ;Korrekciya dlya deleniya DIV DIVSOR ;Delenie MOV [DI],AL ;Sohranit' chastnoe INC SI INC DI LOOP A20 ;Ciklit'sya 4 raza RET MAIN ENDP CODEGS ENDS END BEGIN Assembler dlya IBM PC. Programmy. 90 TITLE SCREMP (EXE) Vvod vremeni i rascenki, ;vyvod velichiny oplaty ; ---------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKSG ENDS ; ---------------------------------------------------- DATASG SEGMENT PARA 'Data' HRSPAR LABLE BYTE ;Spisok parametrov dlya ; vvoda vremeni: MAXHLEN DB 6 ;--------------------- ACTHLEN DB ? HRSFLD DB 6 DUP(?) RATEPAR LABLE BYTE ;Spisok parametrov dlya ; vvoda rascenki: MAXRLEN DB 6 ;--------------------- ACTRLEN DB ? RATEFLN DB 6 DUP(?) MESSG1 DB 'Hours worked? ','$' MESSG2 DB 'Rate of pay? ','$' MESSG3 DB 'Wage = ' ASCWAGE DB 10 DUP(30H), 13, 10, '$' ADJUST DW ? ASCHRS DB 0 ASCRATE DB 0 BINVAL DW 00 BINHRS DW 00 BINRATE DW 00 COL DB 00 DECIND DB 00 MULT10 DW 01 NODEC DW 00 ROW DB 00 SHIFT DW ? TENWD DW 10 DATASG ENDS ; ---------------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX MOV AX,0600H CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor A20LOOP: Assembler dlya IBM PC. Programmy. 91 CALL B10INPT ;Vvesti vremya i rascenku CMP ACTHLEN,00 ;Zavershit' rabotu? JE A30 CALL D10HOUR ;Poluchit' dvoichnoe vremya CALL E10RATE ;Poluchit' dvoichnuyu rascenku CALL F10MULT ;Raschitat' oplatu CALL G10WAGE ;Preobrazovat' v ASCII CALL K10DISP ;Vydat' rezul'tat na ekran JMP A20LOOP A30: MOV AX,0600H CALL Q10SCR ;Ochistit' ekran RET ;Vyjti iz programmy BEGIN ENDP ; Vvod vremeni i rascenki ; ---------------------------------------------------- B10INPT PROC LEA DX,MESSG1 ;Zapros dlya vvoda vremeni MOV AH,09 INT 21H LEA DX,HRSPAR ;Vvesti vremya MOV AH,0AH INT 21H CMP ACTHLEN,00 ;Pustoj vvod? JNE B20 RET ; da - vernut'sya A20LOOP B20: MOV COL,25 ;Ustanovit' stolbec CALL Q20CURS LEA DX,MESSG2 ;Zapros dlya vvoda zascenki MOV AH,09 INT 21H LEA DX,RATEPAR ;Vvesti rascenku MOV AH,0AH INT 21H RET B10INPT ENDP ; Obrabotka vremeni: ; ----------------- D10HOUR PROC MOV NODEC,00 MOV CL,ACTHLEN SUB CH,CH LEA SI,HRSFLD-1 ;Ustanovit' pravuyu poziciyu ADD SI,CX ; vremeni CALL M10ASBI ;Preobrazovat' v dvoichnoe MOV AX,BINVAL MOV BINHRS,AX RET D10HOUR ENDP ; Obrabotka rascenki: ; ------------------ E10RATE PROC Assembler dlya IBM PC. Programmy. 92 MOV CL,ACTRLEN SUB CH,CH LEA SI,RATEFLD-1 ;Ustanovit' pravuyu poziciyu ADD SI.CX ; rascenki CALL M10ASBI ;Preobrazovat' v dvoichnoe MOV AX,BINVAL MOV BINRATE,AX RET E10RATE ENDP ; Umnozhenie, okruglenie i sdvig: ; ----------------------------- F10MULT PROC MOV CX,05 LEA DI,ASCWAGE ;Ustanovit' format oplaty MOV AX,3030H ; v kod ASCII (30) CLD REP STOSW MOV SHIFT,10 MOV ADJUST,00 MOV CX,NODEC CMP CL,06 ;Esli bolee 6 desyatichnyh JA F40 ; znakov, to oshibka DEC CX DEC CX JLE F30 ;Obojti, esli menee 3 znakov MOV NODEC,02 MOV AX,01 F20: MUL TENWD ;Vychislit' faktor sdviga LOOP F20 MOV SHIFT,AX SHR AX,1 ;Okruglit' rezul'tat MOV ADJUST,AX F30: MOV AX,BINHRS MUL BINRATE ;Vychislit' oplatu ADD AX,ADJUST ;Okruglit' oplatu ADC DX,00 CMP DX,SHIFT ;Rezul'tat slishkom velik JB F50 ; dlya komandy DIV? F40: SUB AX,AX JMP F70 F50: CMP ADJUST,00 ;Sdvig nee trebuetsya? JZ F80 DIV SHIFT ;Sdvinut' oplatu F70: SUB DX,DX ;Steret' ostatok F80: RET F10MULT ENDP ; Preobrazovanie v ASCII format: ; ----------------------------- G10WAGE PROC Assembler dlya IBM PC. Programmy. 93 LEA SI,ASCWAGE+7 ;Ustanovit' des. tochku MOV BYTE PTR[SI],'.' ADD SI,NODEC ;Ustanovit' pravuyu poziciyu G30: CMP BYTE PTR[SI],'.' JNE G35 ;Obojti, esli des.poz. DEC SI G35: CMP DX,00 ;Esli dx:ax < 10, JNZ G40 CMP AX,0010 ; to operaciya zavershena JB G50 G40: DIV TENWD ;Ostatok - ASCII-cifra OR DL,30H MOV [SI],DL ;Zapisat' ASCII simvol DEC SI SUB DX,DX ;Steret' ostatok JMP G30 G50: OR AL,30H ;Zapisat' poslednij ASCII MOV [SI],AL ; simvol RET G10WAGE ENDP ; Vyvod velichiny oplaty: ; --------------------- K10DISP PROC MOV COL,50 ;Ustanovit' stolbec CALL Q20CURS MOV CX,09 LEA SI,ASCWAGE K20: ;Steret' lidiruyushchie nuli CMP BYTE PTR[SI],30H JNE K30 ; probelami MOV BYTE PTR[SI],20H INC SI LOOP K20 K30: LEA DX,MESSG3 ;Vyvod na ekran MOV AH,09 INT 21H CMP ROW,20 ;Poslednyaya stroka ekrana? JAE K80 INC ROW ; net - uvelichit' stroku JMP K90 K80: MOV AX,0601H ; da -- CALL Q10SCR ; prokrutit' i MOV COL,00 ; ustanovit' kursor CALL Q20CURS K90: RET K10DISP ENDP ; Preobrazovanie ASCII-chisel Assembler dlya IBM PC. Programmy. 94 ; v dvoichnoe predstavlenie: ; -------------------------- M10ASBI PROC MOV MULT10,0001 MOV BINVAL,00 MOV DECIND,00 SUB BX,BX M20: MOV AL,[SI] ;ASCII-simvol CMP AL,'.' ;Obojti, esli des.tochka JNE M40 MOV DECIND,01 JMP M90 M40: AND AX,000FH MUL MULT10 ;Umnozhit' na faktor ADD BINVAL,AX ;Slozhit' s dv.znacheniem MOV AX,MULT10 ;Vuchislit' sleduyushchij MUL TENVD ; faktor x 10 MOV MULT10,AX CMP DECIND,00 ;Desyatichnaya tochka? JNZ M90 INC BX ; da - obojti tochku M90: DEC SI LOOP M20 ;Konec cikla CMP DECIND,00 ;Byla des.tochka? JZ M100 ; da -- ADD NODEC,BX ; slozhit' s itogom M100: RET M10ASBI ENDP ; Prokrutka ekrana: ; ---------------- Q10SCR PROC NEAR ;AX ustanovlen pri vyzove MOV BH,30 ;Cvet (07 dlya ch/b) SUB CX,CX MOV DX,184FH INT 10H RET Q10SCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 SUB BH,BH MOV DH,ROW MOV DL,COL INT 10H RET Q20CURS ENDP CODESG ENDS Assembler dlya IBM PC. Programmy. 95 END BEGIN Assembler dlya IBM PC. Programmy. 96 page 60,132 TITLE DIRECT (COM) Pryamoj tablichnyj dostup CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ------------------------------------------------ THREE DB 3 MONIN DB '11' ALFMON DB '???','$' MONTAB DB 'JAN','FEB','MAR','APR','MAY','JUN' DB 'JUL','AUG','SEP','OKT','NOV','DEC' ; ------------------------------------------------ MAIN PROC NEAR ;Osnovnaya procedura CALL C10CONV ;Poluchit' dvoichnoe znachenie CALL D10LOC ;Vydelit' mesyac iz tablicy CALL F10DISP ;Vydat' mesyac na ekran RET MAIN ENDP ; Perevod ASCII v dvoichnoe predstavlenie: ; -------------------------------------- C10CONV PROC MOV AH,MONIN ;Zagruzit' nomer mesyaca MOV AL,MONIN+1 XOR AX,3030H ;Udalit' ASCII trojki CMP AH,00 ;Mesyac 01-09? JZ C20 ; da - obojti SUB AH,AH ; net - ochistit' AH, ADD AL,10 ; i perevesti v dvoichnoe C20 RET C10CONV ENDP ; Vydelenie mesyaca iz tablicy: ; --------------------------- D10LOC PROC LEA SI,MONTAB DEC AL ;Korrekciya dlya tablicy MUL THREE ;Umnozhit' AL na 3 ADD SI,AX MOV CX,03 ;Trehsimvol'naya peresylka CLD LEA DI,ALFMON REP MOVSB ;Pereslat' 3 simvola RET D10LOC ENDP ; Vyvod na ekran simv.mesyaca: ; -------------------------- F10DISP PROC LEA DX,ALFMON MOV AH,09 INT 21H RET F10DISP ENDP Assembler dlya IBM PC. Programmy. 97 CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 98 page 60,132 TITLE TABSRCH (COM) Tablichnyj poisk CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ----------------------------------------------- STOKNIN DW '23' STOKTAB DB '05','Excavators' DB '08','Lifters ' DB '09','Presses ' DB '12','Valves ' DB '23','Processors' DB '27','Pumps ' DESCRN 10 DUP(?) ; ----------------------------------------------- MAIN PROC NEAR MOV AX,STOKNIN ;Zagruzit' nomer elementa XCHG AL,AH MOV CX,06 ;CHislo elementov v tablice LEA SI,STOKTAB ;Nachal'nyj adres tablicy A20: CMP AX,[SI] ;Sravnit' elementy JE A30 ;Esli ravny - vyjti, ADD SI,12 ; net - sleduyushchij element LOOP A20 CALL R10ERR ;|lement v tablice ne najden RET A30: MOV CX,05 ;Dlina opisaniya elementa LEA DI,DESCRN ;Adres opisaniya elementa INC SI INC SI ;Vydelit' opisanie REP MOVSW ; iz tablicy RET MAIN ENDP ; R10ERR PROC ; <Vyvod soobshcheniya ob oshibke> RET R10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 99 page 60,132 TITLE TABSRCH (COM) Tablichnyj poisk, ispol'zuyushchij CMPSB CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ---------------------------------------------------- STOKNIN DW '123' STOKTAB DB '035','Excavators' ;Nachalo tablicy DB '038','Lifters ' DB '049','Presses ' DB '102','Valves ' DB '123','Processors' DB '127','Pumps ' DB '999', 10 DUP(' ') ;Konec tablicy DESCRN 10 DUP(?) ; ---------------------------------------------------- MAIN PROC NEAR CLD LEA SI,STOKTAB ;Nachal'nyj adres tablicy A20: MOV CX,03 ;Sravnivat' po 3 bajta LEA DI,STOKNIN ;Adres iskomogo elementa REPE CMPSB ;Sravnenie JE A30 ;Esli ravno - vyjti, JA A40 ;esli bol'she - net v tablice ADD SI,CX ;Pribavit' CX k adresu JMP A20 ;Sleduyushchij element tablicy A30: MOV CX,05 ;Peresylat' 5 slov LEA DI,DESCRN ;Adres opisaniya REP MOVSV ;Pereslat' iz tablicy RET A40: CALL R10ERR ;element v tablice ne najden RET MAIN ENDP R10ERR PROC ; <Vyvod na ekran soobshcheniya ob oshibke> RET R10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 100 page 60,132 TITLE XLATE (COM) Perevod koda ASCII v kod EBCDIC CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ; ---------------------------------------------------- ASCNO DB '-31.5' EBCNO DB 6 DUP(' ') XLTAB DB 45 DUP(40H) DB 60H, 2DH DB 5CH DB 0F0H,0F1H,0F2H,0F3H,0F4H DB 0F5H,0F6H,0F7H,0F8H,0F9H DB 199 DUP(40H) ; ---------------------------------------------------- MAIN PROC NEAR ;Osnovnaya procedura LEA SI,ASCNO ;Adres simvolov ASCNO LEA DI,EBCNO ;Adres polya EBCNO MOV CX,06 ;Dlina LEA BX,XLTAB ;Adres tablicy A20: MOV AL,[SI] ;Poluchit' ASCII simvol XLAT ;Perekodirovka MOV [DI],AL ;Zapisat' v pole EBCNO INC DI INC SI LOOP A20 ;Povtorit' 6 raz RET MAIN ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 101 page 60,132 TITLE ASCHEX (COM) Preobrazovanie ASCII v shest. CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ; ----------------------------------------------- DISPROW DB 16 DUP(' '), 13 HEXSTR DB 00 XLATAB DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H ; ----------------------------------------------- MAIN PROC NEAR ;Osnovnaya procedura CALL Q10CLR ;Ochistit' ekran LEA SI,DISPROW A20LOOP: CALL C10HEX ;Perekodirovat' CALL D10DISP ; i vyvesti na ekran CMP HEXCTR,0FFH ;Poslednee znachenie (FF)? JE A50 ; da - zavershit' INC HEXCTR ; net - perejti k sleduyushchemu JMP A20LOOP A50: RET MAIN ENDP C10HEX PROC NEAR ;Perekodirovka v shest. MOV AH,00 MOV AL,HEXCTR ;Poluchit' shest.paru SHR AX,CL ;Sdvig pravoj shest.cifry LEA BX,XLATAB ;Ustanovit' adres tablicy MOV CL,04 ;Ustanovit' velichinu sdviga XLAT ;Perekodirovka v shest. MOV [SI],AL ;Zapisat' levyj simvol MOV AL,HEXCTR SHL AX,CL ;Sdvig levoj cifry XLAT MOV [SI]+1,AL ;Perekodirovka v shest. RET ;Zapisat' pravyj simvol C10HEX ENDP D10DISP PROC NEAR ;Vyvod na ekran MOV AL,HEXCTR MOV [SI]+3,AL CMP AL,1AH ;Simvol EOF? JE D20 ; da - obojti CMP AL,07H ;Men'she/ravno 08? JB D30 ; da - OK CMP AL,10H ;Bol'she/ravno 0F? JAE D30 ; da - OK D20: MOV BYTE PTR [SI]+3,20H Assembler dlya IBM PC. Programmy. 102 D30: ADD SI,05 ;Sleduyushchij element v stroke LEA DI,DISPROW+80 CMP DI,SI JNE D40 MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer ustrojstva MOV CX,81 ;Vsya stroka LEA DX,DISPROW INT 21H LEA SI,DISPROW ;Nachal'nyj adres stroki D40: RET D10DISP ENDP Q10CLR PROC NEAR ;Ochistka ekrana MOV AX,0600H MOV BH,03 ;Cvet (07 dlya ch/b) MOV CX,0000 MOV DX,184FH INT 10H RET Q10CLR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 103 page 60,132 TITLE NMSORT (EXE) Vvod i sortirovka imen ; ----------------------------------------------- STACK SGMENT PARA STACK 'Stack' DW 32 DUP(?) STACK ENDS ; ----------------------------------------------- DATASG SEGMENT PARA 'Data' NAMEPAR LABEL BYTE ;Imya spiska parametrov: MAXNLEN DB 21 ; maks. dlina NAMELEN DB ? ; chislo vvedennyh simvolov NAMEFLD DB 21 DUP(' ') ; imya CRLF DB 13, 10, '$' ENDADDR DW ? MESSG1 DB 'Name?', '$' NAMECTR DB 00 NAMETAB DB 30 DUP(20 DUP(' ')) ;Tablica imen NAMESAV DB 20 DUP(?), 13, 10, '$' SWAPPED DB 00 DATA ENDS ; ----------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATDSG,SS:STACK,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX CLD LEA DI,NAMETAB CALL Q10CLR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor A20LOOP: CALL B10READ ;Vvesti imya s klaviatury CMP NAMELEN,00 ;Est' li eshche imena? JZ A30 ; net - idti na sortirovku CMP NAMECTR,30 ;Vvedeno 30 imen? JE A30 ; da - idti na sortirovku CALL D10STOR ;Zapisat' imya v tablicu JMP A20LOOP A30: ;Konec vvoda imen CALL Q10CLR ;Ochistit' ekran CALL Q20CURS ; i ustanovit' kursor CMP NAMECTR,01 ;Vvedeno menee 2 imen? JBE A40 ; da - vyjti CALL G10SORT ;Sortirovat' imena CALL K10DISP ;Vyvesti rezul'tat na ekran A40: RET ;Zavershit' programmu BEGIN ENDP Assembler dlya IBM PC. Programmy. 104 ; Vvod imen s klaviatury? ; ---------------------- B10READ PROC MOV AH,09 LEA DX,MESSG1 ;Vyvesti tekst zaprosa INT 21H MOV AH,0AH LEA DX,NAMEPAR ;Vvesti imya INT 21H MOV AH,09 LEA DX,CRLF ;Vyvesti CRLF INT 21H MOV BH,00 ;Ochistit' pole posle imeni MOV BL,NAMELEN ;Poluchit' schetchik simvolov MOV CX,21 SUB CX,BX ;Vychislit' ostavshuyusya dlinu B20: MOV NAMEFLD[BX],20H ;Ustanovit' simvol probela INC BX LOOP B20 RET B10READ ENDP ; Zapis' imeni v tablicu: ; ---------------------- D10STOR PROC INC NAMECTR ;CHislo imen v tablice CLD LES SI,NAMEFLD MOV CX,10 REP MOVSV ;Pereslat' imya v tablicu RET D10STOR ENDP ; Sortirovka imen v tablice: ; ------------------------- G10SORT PROC SUB DI,40 ;Ustanovit' adresa ostanova MOV ENDADDR,DI G20: MOV SWAPPED,00 ;Ustanovit' nachalo LEA SI,NAMETAB ; tablicy G30: MOV CX,20 ;Dlina sravneniya MOV DI,SI ADD DI,20 ;Sleduyushchee imya dlya sravneniya MOV AX,DI MOV BX,SI REPE CMPSB ;Sravnit' imya so sleduyushchim JBE G40 ; net perestanovki CALL H10XCHG ; perestanovka G40: MOV SI,AX CMP SI,ENDADDR ;Konec tablicy? Assembler dlya IBM PC. Programmy. 105 JBE G30 ; net - prodolzhit' CMP SWAPPED,00 ;Est' perestanovki? JNZ G20 ; da - prodolzhit', RET ; net - konec sortirovki G10SORT ENDP ; Perestanovka elementov tablicy: ; ------------------------------ H10XCHG PROC MOV CX,10 LEA DI,NAMESAV MOV SI,BX REP MOVSW ;Sohranit' men'shij element MOV CX,10 MOV DI,BX REP MOVSW ;Pereslat' bol'shij element ; na mesto men'shego MOV CX,10 LEA SI,NAMESAV REP MOVSW ;Pereslat' sohranennyj ; element na mesto bol'shego MOV SWAPPED,01 ;Priznak perestanovki RET H10XCHG ENDP ; Vyvod na ekran otsortirovannye imena: ; ------------------------------------ K10DISP PROC LEA SI,NAMETAB K20: LEA DI,NAMESAV ;Nachal'nyj adres tablicy MOV CX,10 REP MOVSV MOV AH,09 LEA DX,NAMESAV INT 21H ;Vyvesti na ekran DEC NAMECTR ;|to poslednij element? JNZ K20 ; net - povtorit' cikl, RET ; da - vyjti K10DISP ENDP ; Ochistka ekrana: ; -------------- Q10CLR PROC MOV AX,0600H MOV BH,61H ;Cvet (07 dlya ch/b) SUB CX,CX MOV DX,184FH INT 10H RET Q10CLR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC MOV AH,02 Assembler dlya IBM PC. Programmy. 106 SUB BH,BH SUB DX,DX ;Ustanovit' kursor v 00,00 INT 10H RET Q20CURS ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 107 page 60,132 TITLE FCBCREAT (EXE) Ispol'zovanie FCB dlya sozdaniya fajla ;---------------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 80 DUP(?) STACKSG ENDS ;---------------------------------------------------------- DATASG SEGMENT PARA 'Data' RECLEN EQU 32 NAMEPAR LABEL BYTE ;Spisok parametrov: MAXLEN DB RECLEN ; maks.dlina imeni NAMELEN DB ? ; chislo vvedennyh simvolov NAMEDTA DB RECLEN DUP(' ') ; oblast' peredachi (DTA) FCBREC LABEL BYTE ;FCB dlya diskovogo fajla FCBDRIV DB 04 ; diskovod D FCBNAME DB 'NAMEFILE' ; imya fajla FCBEXT DB 'DAT' ; tip fajla FCBBLK DW 0000 ; nomer tekushchego bloka FCBRCSZ DW ? ; razmer logicheskoj zapisi FCBFLSZ DD ? ; razmer fajla (DOS) DW ? ; data (DOS) DT ? ; zarezervirovano (DOS) FCBSQRC DB 00 ; nomer tekushchej zapisi DD ? ; otnositel'nyj nomer CRLF DB 13,10,'$' ERRCDE DB 00 PROMPT DB 'Name? ','$' ROW DB 01 OPNMSG DB '*** Open error ***', '$' WRTMSG DB '*** Write error ***', '$' DATASG ENDS ; --------------------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX MOV AX,0600H CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL C10OPEN ;Otkryt', ustanovit' DTA CMP ERRCDE,00 ;Est' mesto na diske? JZ A20LOOP ; da - prodolzhit', RET ; net - vernut'sya v DOS A20LOOP: CALL D10PROC Assembler dlya IBM PC. Programmy. 108 CMP NAMELEN,00 ;Konec vvoda? JNE A20LOOP ; net - prodolzhit', CALL