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



       

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


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

MOV CL,ACTRLEN SUB CH,CH LEA SI,RATEFLD-1 ;Установить правую позицию ADD SI.CX ; расценки CALL M10ASBI ;Преобразовать в двоичное MOV AX,BINVAL MOV BINRATE,AX RET E10RATE ENDP ; Умножение, округление и сдвиг: ; ----------------------------- F10MULT PROC MOV CX,05 LEA DI,ASCWAGE ;Установить формат оплаты MOV AX,3030H ; в код ASCII (30) CLD REP STOSW MOV SHIFT,10 MOV ADJUST,00 MOV CX,NODEC CMP CL,06 ;Если более 6 десятичных JA F40 ; знаков, то ошибка DEC CX DEC CX JLE F30 ;Обойти, если менее 3 знаков MOV NODEC,02 MOV AX,01 F20: MUL TENWD ;Вычислить фактор сдвига LOOP F20 MOV SHIFT,AX SHR AX,1 ;Округлить результат MOV ADJUST,AX F30: MOV AX,BINHRS MUL BINRATE ;Вычислить оплату ADD AX,ADJUST ;Округлить оплату ADC DX,00 CMP DX,SHIFT ;Результат слишком велик JB F50 ; для команды DIV? F40: SUB AX,AX JMP F70 F50: CMP ADJUST,00 ;Сдвиг нее требуется? JZ F80 DIV SHIFT ;Сдвинуть оплату F70: SUB DX,DX ;Стереть остаток F80: RET F10MULT ENDP ; Преобразование в ASCII формат: ; ----------------------------- G10WAGE PROC

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

LEA SI,ASCWAGE+7 ;Установить дес. точку MOV BYTE PTR[SI],'.' ADD SI,NODEC ;Установить правую позицию G30: CMP BYTE PTR[SI],'.' JNE G35 ;Обойти, если дес.поз. DEC SI G35: CMP DX,00 ;Если dx:ax < 10, JNZ G40 CMP AX,0010 ; то операция завершена JB G50 G40: DIV TENWD ;Остаток - ASCII-цифра OR DL,30H MOV [SI],DL ;Записать ASCII символ DEC SI SUB DX,DX ;Стереть остаток JMP G30 G50: OR AL,30H ;Записать последний ASCII MOV [SI],AL ; символ RET G10WAGE ENDP ; Вывод величины оплаты: ; --------------------- K10DISP PROC MOV COL,50 ;Установить столбец CALL Q20CURS MOV CX,09 LEA SI,ASCWAGE K20: ;Стереть лидирующие нули CMP BYTE PTR[SI],30H JNE K30 ; пробелами MOV BYTE PTR[SI],20H INC SI LOOP K20 K30: LEA DX,MESSG3 ;Вывод на экран MOV AH,09 INT 21H CMP ROW,20 ;Последняя строка экрана? JAE K80 INC ROW ; нет - увеличить строку JMP K90 K80: MOV AX,0601H ; да -- CALL Q10SCR ; прокрутить и MOV COL,00 ; установить курсор CALL Q20CURS K90: RET K10DISP ENDP ; Преобразование ASCII-чисел




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