Модернизировать программу, чтобы переменные можно было вводить с клавиатуры - Assembler
Формулировка задачи:
программа выполняет подсчет формулы
модернизируйте плз программу, чтобы переменные можно было вводить с клавиатуры
TITLE PROGNAME (EXE) ;---------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKSG ENDS ;---------------------------------------- DATASG SEGMENT PARA 'Data' A DW (2) B DW (4) C DW (3) X DW (4) ;Y DW (5) AUX DW (?) AUX2 DW (?) AUX3 DW (?) AUX4 DW (3) UVAR DW (?) ; ASCVAL DB ' ','$' ; EXIT DW (?) ; DATASG ENDS ;---------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG, DS:DATASG, SS:STACKSG PUSH DS XOR AX,AX ; PUSH AX ; * MOV AX,DATASG ; MOV DS,AX ; LEA SI,ASCVAL ;---------------------------------------- ;y = a^2*x^2 \ (b-2) - 3*a^3*x^3 + (x + a^3) \ 5 ;---------------------------------------- CALL SCHET ;вызов процедуры подсчета MOV UVAR,AX ; ;---------------------------------------- ; ;---------------------------------------- ;---------------------------------------- ; ;---------------------------------------- CALL SCRLIN ; RET ; BEGIN ENDP ; ;**************************************** SCHET PROC NEAR MOV AX, A IMUL A ;A^2 MOV AUX, AX ;AUX СОДЕРЖИТ A^2 MOV AX, X IMUL X ;X^2 IMUL AUX ;A^2*X^2 MOV AUX2, AX ;AUX2 СОДЕРЖИТ A^2*X^2 MOV AX, B MOV AUX, AX ;AUX СОДЕРЖИТ B SUB AUX, 2 ;AUX СОДЕРЖИТ B-2 MOV AX, AUX2 DIV AUX MOV AUX, AX ;AUX СОДЕРЖИТ A^2*X^2 \ (B-2) MOV AX, A IMUL A IMUL A ;A^3 MOV AUX2, AX ;AUX2 СОДЕРЖИТ A^3 MOV AX, X IMUL X IMUL X ;X^3 IMUL AUX2 ;A^3*X^3 IMUL AUX4 ;3*A^3*X^3 MOV AUX2, AX ;AUX2 СОДЕРЖИТ 3*A^3*X^3 MOV AX, A IMUL A IMUL A ;A^3 ADD AX, X ;X+A^3 MOV AUX4, 5 DIV AUX4 ;(X+A^3) \ 5 MOV AUX3, AX ;AUX3 СОДЕРЖИТ (X+A^3) \ 5 MOV AX, AUX SUB AX, AUX2 ADD AX, AUX3 ;все выражение в AX RET SCHET ENDP SCRLIN PROC NEAR ;---------------------------------------- ; * ;---------------------------------------- MOV AX,0600H MOV BH,07 MOV CX,0000 MOV DX,184FH INT 10H ;---------------------------------------- ; ;---------------------------------------- MOV AH,02 MOV BH,00 MOV DX,0000 INT 10H ;---------------------------------------- ; ;---------------------------------------- MOV CX,10 MOV AX,UVAR CMP AX,0000 JNS L10 MOV BH,2DH MOV [SI],BH NEG AX L10: ADD SI,5 L15: CMP AX,10 JB L20 XOR DX,DX DIV CX OR DL,30H MOV [SI],DL DEC SI JMP L15 L20: OR AL,30H MOV [SI],AL ;---------------------------------------- ; ;---------------------------------------- MOV AH,09 LEA DX,ASCVAL INT 21H ;---------------------------------------- ; ;---------------------------------------- MOV AH,00 INT 16H RET SCRLIN ENDP ;**************************************** CODESG ENDS END BEGIN
upup
upup
Решение задачи: «Модернизировать программу, чтобы переменные можно было вводить с клавиатуры»
textual
Листинг программы
TITLE PROGNAME (EXE) ;---------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 32 DUP(?) STACKSG ENDS ;---------------------------------------- DATASG SEGMENT PARA 'Data' ; ... A DW (?) B DW (?) C DW (?) X DW (?) AUX DW (?) AUX2 DW (?) AUX3 DW (?) AUX4 DW (3) UVAR DW (?) MES DB 'Write your name : $' MES2 DB 'Write A : $' MES3 DB 'Write B : $' MES4 DB 'Write C : $' MES5 DB 'Write X : $' MESA DB 'A = $' MESB DB 'B = $' MESC DB 'C = $' MESX DB 'X = $' ENT DB ' $' PROG DB 'PROG NAME 13TEST.ASM $' MESREZULT DB 'REZULT = $' MAS DW 50 DUP ('$') ASCVAL DB ' ','$' ; и*Ў«®* ўлў®¤* EXIT DW (?) ; ўл室 Ї® «оЎ®© Є«*ўЁиҐ DATASG ENDS ;---------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG, DS:DATASG, SS:STACKSG PUSH DS XOR AX,AX ; §*ЇЁбм ў б⥪ PUSH AX ; *г«Ґў®Ј® *¤аҐб* MOV AX,DATASG ; §*бл«Є* *¤аҐб* MOV DS,AX ; DATASG ў ॣЁбва DS LEA SI,ASCVAL ;---------------------------------------- ; ... ; ... CALL VIVOD RET ; BEGIN ENDP VVODNAME PROC NEAR MOV AH,3FH ;номер функции MOV BX,0 ;номер дескриптора файла LEA DX,MAS ;указатель на буфер ввода строки MOV CX,100 ;максимальная длина строки INT 21H ;ждем ввода RET VVODNAME ENDP VVODNUMBER PROC mov ah,0ah xor di,di mov dx,offset buff ; аддрес буфера int 21h ; принимаем строку mov dl,0ah mov ah,02 int 21h ; выводим перевода строки ; обрабатываем содержимое буфера mov si,offset buff+2 ; берем аддрес начала строки cmp byte ptr [si],"-" ; если первый символ минус jnz ii1 mov di,1 ; устанавливаем флаг inc si ; и пропускаем его ii1: xor ax,ax mov bx,10 ; основание сc ii2: mov cl,[si] ; берем символ из буфера cmp cl,0dh ; проверяем не последний ли он jz endin ; если символ не последний, то проверяем его на правильность cmp cl,'0' ; если введен неверный символ <0 jl er cmp cl,'9' ; если введен неверный символ >9 ja er sub cl,'0' ; делаем из символа число mul bx ; умножаем на 10 add ax,cx ; прибавляем к остальным inc si ; указатель на следующий символ jmp ii2 ; повторяем er: ; если была ошибка, то выводим сообщение об этом и выходим mov dx, offset error mov ah,09 int 21h int 20h ; все символы из буфера обработаны число находится в ax endin: cmp di,1 ; если установлен флаг, то jnz ii3 neg ax ; делаем число отрицательным ii3: ret error db "incorrect number$" buff db 6,7 Dup(?) VVODNUMBER ENDP VIVODNUMBER PROC ;; Проверяем число на знак. test ax, ax jns oi1 ;; Если оно отрицательное, выведем минус и оставим его модуль. mov cx, ax mov ah, 02h mov dl, '-' int 21h mov ax, cx neg ax ;; Количество цифр будем держать в CX. oi1: xor cx, cx mov bx, 10 ; основание сс. 10 для десятеричной и т.п. oi2: xor dx,dx div bx ; Делим число на основание сс. В остатке получается последняя цифра. ; Сразу выводить её нельзя, поэтому сохраним её в стэке. push dx inc cx ; А с частным повторяем то же самое, отделяя от него очередную ; цифру справа, пока не останется ноль, что значит, что дальше ; слева только нули. test ax, ax jnz oi2 ; Теперь приступим к выводу. mov ah, 02h oi3: pop dx ; Извлекаем очередную цифру, переводим её в символ и выводим. add dl, '0' int 21h ; Повторим ровно столько раз, сколько цифр насчитали. loop oi3 ret VIVODNUMBER ENDP SCHET PROC NEAR MOV AX, A IMUL A ;A^2 MOV AUX, AX ;AUX СОДЕРЖИТ A^2 MOV AX, X IMUL X ;X^2 IMUL AUX ;A^2*X^2 MOV AUX2, AX ;AUX2 СОДЕРЖИТ A^2*X^2 MOV AX, B MOV AUX, AX ;AUX СОДЕРЖИТ B SUB AUX, 2 ;AUX СОДЕРЖИТ B-2 MOV AX, AUX2 DIV AUX MOV AUX, AX ;AUX СОДЕРЖИТ A^2*X^2 \ (B-2) MOV AX, A IMUL A IMUL A ;A^3 MOV AUX2, AX ;AUX2 СОДЕРЖИТ A^3 MOV AX, X IMUL X IMUL X ;X^3 IMUL AUX2 ;A^3*X^3 IMUL AUX4 ;3*A^3*X^3 MOV AUX2, AX ;AUX2 СОДЕРЖИТ 3*A^3*X^3 MOV AX, A IMUL A IMUL A ;A^3 ADD AX, X ;X+A^3 MOV AUX4, 5 DIV AUX4 ;(X+A^3) \ 5 MOV AUX3, AX ;AUX3 СОДЕРЖИТ (X+A^3) \ 5 MOV AX, AUX SUB AX, AUX2 ADD AX, AUX3 ;все выражение в AX RET SCHET ENDP VIVOD PROC NEAR MOV AH,9 ; LEA DX,MES ; INT 21H ; CALL VVODNAME MOV AH,9 ; LEA DX,MES2 ; INT 21H ; CALL VVODNUMBER MOV A, AX MOV AH,9 ; LEA DX,MES3 ; INT 21H ; CALL VVODNUMBER MOV B, AX MOV AH,9 ; LEA DX,MES4 ; INT 21H ; CALL VVODNUMBER MOV C, AX MOV AH,9 ; LEA DX,MES5 ; INT 21H ; CALL VVODNUMBER MOV X, AX MOV AH,9 ; LEA DX,PROG ; INT 21H ; MOV AH,9 ; LEA DX,MAS ; INT 21H ; MOV AH,9 ; LEA DX,MESA ; INT 21H ; MOV AX, A ; CALL VIVODNUMBER MOV AH,9 ; LEA DX,ENT ; INT 21H ; MOV AH,9 ; LEA DX, MESB ; INT 21H ; MOV AX, B ; CALL VIVODNUMBER MOV AH,9 ; LEA DX,ENT ; INT 21H ; MOV AH,9 ; LEA DX, MESC ; INT 21H ; MOV AX, C ; CALL VIVODNUMBER MOV AH,9 ; LEA DX,ENT ; INT 21H ; MOV AH,9 ; LEA DX, MESX ; INT 21H ; MOV AX, X ; CALL VIVODNUMBER MOV AH,9 ; LEA DX,ENT ; INT 21H MOV AH,9 ; LEA DX, MESREZULT ; INT 21H ; CALL SCHET CALL VIVODNUMBER RET VIVOD ENDP ;**************************************** CODESG ENDS END BEGIN
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д