Ассемблер и программирование для IBM PC



         

ГЛАВА 23. Прерывания BIOS и DOS - часть 26


TITLE ASCDIV (COM) Деление ASCII-чисел CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; --------------------------------------------- DIVDND DB '3698' ;Элементы данных DIVSOR DB '4' QUOTNT DB 4 DUP(0) ; --------------------------------------------- MAIN PROC NEAR MOV CX,04 ;4 цикла SUB AH,AH ;Стереть левый байт делимого AND DIVSOR,0FH ;Стереть ASCII 3 в делителе LEA SI,DIVDND LEA DI,QUOTNT A20:

Ассемблер для IBM PC. Программы. 89

MOV AL,[SI] ;Загрузить ASCII байт ; (можно LODSB) AND AL,0FH ;Стереть ASCII тройку AAD ;Коррекция для деления DIV DIVSOR ;Деление MOV [DI],AL ;Сохранить частное INC SI INC DI LOOP A20 ;Циклиться 4 раза RET MAIN ENDP CODEGS ENDS END BEGIN

Ассемблер для IBM PC. Программы. 90

TITLE SCREMP (EXE) Ввод времени и расценки, ;вывод величины оплаты ; ---------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKSG ENDS ; ---------------------------------------------------- DATASG SEGMENT PARA 'Data' HRSPAR LABLE BYTE ;Список параметров для ; ввода времени: MAXHLEN DB 6 ;--------------------- ACTHLEN DB ? HRSFLD DB 6 DUP(?)

RATEPAR LABLE BYTE ;Список параметров для ; ввода расценки: 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 ;Очистить экран CALL Q20CURS ;Установить курсор A20LOOP:

Ассемблер для IBM PC. Программы. 91

CALL B10INPT ;Ввести время и расценку CMP ACTHLEN,00 ;Завершить работу? JE A30 CALL D10HOUR ;Получить двоичное время CALL E10RATE ;Получить двоичную расценку CALL F10MULT ;Расчитать оплату CALL G10WAGE ;Преобразовать в ASCII CALL K10DISP ;Выдать результат на экран JMP A20LOOP A30: MOV AX,0600H CALL Q10SCR ;Очистить экран RET ;Выйти из программы BEGIN ENDP ; Ввод времени и расценки ; ---------------------------------------------------- B10INPT PROC LEA DX,MESSG1 ;Запрос для ввода времени MOV AH,09 INT 21H LEA DX,HRSPAR ;Ввести время MOV AH,0AH INT 21H CMP ACTHLEN,00 ;Пустой ввод? JNE B20 RET ; да - вернуться A20LOOP B20: MOV COL,25 ;Установить столбец CALL Q20CURS LEA DX,MESSG2 ;Запрос для ввода засценки MOV AH,09 INT 21H LEA DX,RATEPAR ;Ввести расценку MOV AH,0AH INT 21H RET B10INPT ENDP ; Обработка времени: ; ----------------- D10HOUR PROC MOV NODEC,00 MOV CL,ACTHLEN SUB CH,CH LEA SI,HRSFLD-1 ;Установить правую позицию ADD SI,CX ; времени CALL M10ASBI ;Преобразовать в двоичное MOV AX,BINVAL MOV BINHRS,AX RET D10HOUR ENDP ; Обработка расценки: ; ------------------ E10RATE PROC




Содержание  Назад  Вперед