| Код | TITLE XCOM1 COM-программа для пересылки и сложения CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H ;Начало в конце PSP BEGIN: JMP MAIN ;Обход через данные ; --------------------------------------------------- FLDA DW 250 ;Определение данных FLDB DW 125 FLDC DW ? mssgA DB 'Enter A: $' mssgB DB 'Enter B: $' mssgD DB 'Enter D: $' mssgQ DB 'quotient: $' mssgR DB 'residue: $' mssgE DB 'Overflow error $' mssgE1 DB 'Input string has another symbols $' mssgE2 DB 'Divide by null $'
input DB 10 dup(0) output DB 10 dup(0) RESULT DW 0 MUL_RESULT DD 0 ; --------------------------------------------------- MAIN PROC NEAR MOV AX,FLDA ;Переслать 0250 в AX ADD AX,FLDB ;Прибавить 0125 к AX MOV FLDC,AX ;Записать сумму в FLDC
LEA DX,mssgD CALL WRITE MOV input[0],6 ;Максимальный размер для ввода LEA DX,input ;Загрузка адреса входной строки в регистр CALL READ ;Ввод числа D LEA SI,RESULT CALL STR_TO_INT MOV BX,DX LEA DX,mssgB CALL WRITE LEA DX,input ;Ввод числа B CALL READ CALL STR_TO_INT MOV CX,DX LEA DX,mssgA CALL WRITE LEA DX,input ;Ввод Числа А CALL READ CALL STR_TO_INT CALL CALCULATE LEA SI,output PUSH DX MOV DX,AX CALL INT_TO_STR LEA DX,mssgQ CALL WRITE LEA DX,output CALL WRITE LEA SI,output POP DX CALL INT_TO_STR LEA DX,mssgQ CALL WRITE LEA DX,output CALL WRITE MOV AH, 01 ;Лишний ввод для контроля INT 21h RET ;Вернуться в DOS MAIN ENDP
WRITE PROC PUSH AX MOV AH, 09h INT 21h POP AX RET WRITE ENDp
READ PROC PUSH AX MOV AH,0Ah INT 21h CALL clear_scr POP AX RET READ ENDP
STR_TO_INT PROC NEAR PUSH AX ;Сохранение значения регистров PUSH CX PUSH BX PUSH SI XOR AX,AX ;Обнуление регистров XOR CX,CX XOR BX,BX XOR SI,SI MOV SI,DX ;Перенос адреса строки в регистр BP INC SI ;Переход к реальному количеству символов ADD CL,[SI] ;Установка счетчика цикла MOV BL,10 ;Помещение второго сомножителя в регистр L: INC SI ;Переход к следующему символу строки MUL BX ;Умножение содержимого регистра АХ на 10 JO ERROR ;Подозрение на переполнение, хотя возможно переполнился только 1 регистр TRANSLATE: MOV DX,AX ;Перемещение произведения MOV AL,[SI] ;Добавление в регистр код текущего символа строки cmp AL,30h ;Проверка на нижнюю границу допустимых кодов ASCII jl SYMB_ERROR cmp AL, 39h ;Проверка на верхнюю границу доустимых кодов jg SYMB_ERROR SUB AL,30h ;Вычитание кода символа "0" CBW ADD DX,AX ;Добавление цифры к произведениюмы в АХ для умножения MOV AX,DX ;Перекидывание получившейся су LOOP L ;организация цикла MOV DX,AX ;Возврат числа из функции POP SI POP BX POP CX POP AX RET ERROR: LEA DX,mssgE CALL WRITE CALL DOS_EXIT SYMB_ERROR: LEA DX,mssgE1 CALL WRITE CALL DOS_EXIT
STR_TO_INT ENDP INT_TO_STR PROC NEAR PUSH AX ;Сохранение значения регистров PUSH CX PUSH BX XOR AX,AX ;Обнуление регистров XOR CX,CX XOR BX,BX ;OV CX,DX ;Сохранение регистра DХ
MOV AX,DX ;Перемещение делимого MOV BL,10 ;Перемещение делителя XOR DX,DX ;Обнуление PUSHSTACK: DIV BX ;Деление на 10 ADD DL,30h ;Получение Аски кода ;MOV DX,CX ;Возврат значения DX ;MOV DL,AH ;Копирование символа из регистра PUSH dx XOR DX,DX INC CL ;Увеличиваем счетчик CMP AX,0 ;Сравниваем частное с нулем JNZ PUSHSTACK POPSTACK: POP DX; MOV [SI],DL ;Занесение символа в строку INC SI ;Переход к следующему символу LOOP POPSTACK
MOV [SI],24h POP BX POP CX POP AX RET INT_TO_STR ENDP
CALCULATE PROC XOR AX,AX MOV AX,BX ;Загрузка множимого D в регистр PUSH DX ;Сохранение множителя A в стеке MUL DX POP BX ;Вытаскивание сохраненного слагаемого ADD BX,CX ;Получение делителя JO OVERFLOW_EXIT CMP BX,0 ;проверка на деление на ноль JE NULL_ERROR DIV BX RET NULL_ERROR: LEA DX,mssgE2 CALL WRITE CALL DOS_EXIT OVERFLOW_EXIT: LEA DX, mssgE CALL WRITE CALL DOS_EXIT CALCULATE ENDP
DOS_EXIT PROC MOV AH,07h INT 21h; INT 20h; DOS_EXIT ENDP
clear_scr proc push ax push bx push cx push dx xor al,al ; al:=0 Очистить окно xor cx,cx ; cx:=0 Верхний левый угол (0,0) mov dh,24 ; Нижняя строка экрана 24 mov dl,79 ; Правый столбец экрана 79 mov bh,7 ; Нормальные атрибуты очистки mov ah,6 ; вызов функции scroll_up int 10h pop dx pop cx pop bx pop ax ret clear_scr endp CODESG ENDS END BEGIN
21cd 5a21
|
вот это работающая программа
мне надо добавить переменную C для этого я произвожу такие изменения:
| Код | mssgB DB 'Enter B: $' mssgB DB 'Enter C: $' mssgD DB 'Enter D: $'
|
и тут
| Код | CALL READ ;Ввод числа D LEA SI,RESULT CALL STR_TO_INT MOV BX,DX LEA DX,mssgB CALL WRITE LEA DX,input ;Ввод числа B CALL READ CALL STR_TO_INT MOV CX,DX
LEA DX,mssgС CALL WRITE LEA DX,input ;Ввод числа С CALL READ CALL STR_TO_INT MOV DI,DX LEA DX,mssgA CALL WRITE LEA DX,input ;Ввод Числа А CALL READ CALL STR_TO_INT
|
и после этого не понимаю, что происходит, но переменная A считывается неправильно. что скажете ?
|