Модернизировать программу, чтобы переменные можно было вводить с клавиатуры - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы