Вычесть из 14 элемента 8 (отредактировать код) - Assembler

Узнай цену своей работы

Формулировка задачи:

Ребят, код программы полностью рабочий, но что-то никак не получается переделать умножение (всех элементов на 5) на вычитание (из 14 элемента 8 элемент). Помогите пожалуйста, заранее спасибо
.model small
.data
N=15        ;размер массива
A   dw N dup (0)    ;массив
buf db 8,10 dup(0)  ;принимает строку, введенную с клавиатуры
str0    db 0dh,0ah,'A($';формируемая для вывода строка
str1    db ')= $'
msg1    db 13,10,'Array:$'
msg2    db 13,10,'New array:$'
.stack 256
.code
start:
    mov ax,@data    ;Настраиваем сегментные регистры
    mov ds,ax
    lea bx,A        ;начало массива
    mov cx,0        ;номер элемента(начинаем с 0)
inpmas: mov ah,9        ;функция вывода сообщения на экран
    lea dx,str0     ;(
    int 21h         ;выводим на экран
        mov ax,cx       ;номер элемента
    call printdec       ;преобразуем номер элемента в строку и выводим на экран
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,str1     ;)=
    int 21h         ;выводим на экран
    mov ah,0ah      ;функция ввода строки с клавиатуры
    mov dx,offset buf   ;буфер куда вводить
    int 21h         ;пользователь вводит в текстовом виде в buf значение элемента массива
    lea si,buf[2]       ;начало введенного текста
    call str2dw     ;преобразовываем строку в значение
    mov [bx],ax     ;заносим значение в массив
    add bx,2        ;следующий элемент
    inc cx          ;номер следующего элемента
    cmp cx,N        ;если не равен N
    jnz inpmas      ;то продолжить
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg1     ;выводимое сообщение
    int 21h         ;выводим на экран
    call mas_out        ;вывести массив
    mov cx,N        ;размер массива
    lea si,A        ;начало массива
lp: mov ax,[si]     ;взять очередной элемент
    mov dx,5        ;5
    imul dx         ;A[i]*5
    mov [si],ax     ;A[i]=A[i]*5
    add si,2        ;следующий элемент массива
    loop lp         ;умножить все элементы
    
    mov ah,9        ;функция вывода сообщения на экран
    lea dx,msg2     ;выводимое сообщение
    int 21h         ;выводим на экран
    call mas_out        ;вывести новый массив
    mov ah,1    ;Ожидаем нажатия любой клавиши
    int 21h
    mov ax,4c00h    ;закончить программу
    int 21h
 
mas_out proc
    lea bx,A    ;начало массива A
    mov cx,N    ;количество элементов массива
outmas: mov ax,[bx] ;берем элемент массива
    call printdec   ;преобразовываем число в строку и выводим
    mov ah,2    ;выводим символ
    mov dl,' '  ;разделительный пробел
    int 21h     ;выводим
    add bx,2    ;переходим к следующему элементу массива
    loop outmas ;продолжаем вывод
    ret
    ret
mas_out endp
 
str2dw  proc
;Преобразование строки в число
;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать
; на выходе в ax - число.
    push bx     ;сохраняем регистры
    push dx
    push si
    xor bx,bx
    xor dx,dx   ;сумма
@lp1:   xor ax,ax
    lodsb       ;берем чимвол
    cmp al,13   ;если это конец строки,
    jz @ex      ;то заканчиваем
    cmp al,'-'  ;если минус,
    jnz @m1
    mov bx,1    ;то устанавливаем признак минуса
    jmp @lp1    ;продолжаем обработку
@m1:    cmp al,'9'  ;если это не цифра,
    jnbe @lp1   ;то пропускаем
    cmp al,'0'      ;если это не цифра,
    jb @lp1     ;то пропускаем
    sub ax,'0'  ;получаем цифровое значение
    shl dx,1    ;умножаем сумму на 10
    add ax, dx
    shl dx, 2
    add dx, ax  ;прибавляем текущее значение
    jmp @lp1    ;продолжаем обработку
@ex:    test bx,bx  ;если установлен признак отрицательного числа
    jz @ex1
    neg dx      ;то меняем знак
@ex1:   mov ax,dx   ;помещаем результат в ах
    pop si
    pop dx
    pop bx
    ret     ;выход из подпрограммы
str2dw  endp
;преобразование числа из ах в десятичную строку и вывод на экран
;ax - число
printdec proc
    push cx     ;сохраняем регистры
    push dx
    push bx
    push si
    mov si,ax   ;запоминаем число
    mov bx,10   ;основание системы
    xor cx,cx   ;в сх будет количество цифр в десятичном числе
    test ax,ax  ;если число положительное
    jns @@m1a   ;то пропускаем
    neg ax      ;если отрицательное, то меняем знак
@@m1a:  xor dx,dx   ;очистить старшую часть делимого
    div bx      ;делим число на степени 10
    push dx     ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
    inc cx      ;увеличиваем количество десятичных цифр числа
    test ax,ax  ;после деления остался 0?
    jnz @@m1a   ;если нет, продолжаем
    test si,si  ;число отрицательное?
    jns @@m3a   ;если нет, пропустить
    push -3     ;иначе дописать перех числом минус
    inc cx      ;увеличить количество цифр числа
@@m3a:  mov ah,2        ;ф-я вывода символа
@@m2a:  pop dx      ;взять из стека цифру цисла
    add dl,'0'  ;преобразовываем цифру в ASCII символ
    int 21h     ;вывести на экран
    loop @@m2a  ;все цифры
    pop si      ;восстанавливаем регистры
    pop bx
    pop dx
    pop cx
    ret     ;выход из подпрограммы
printdec endp
 
end start

Решение задачи: «Вычесть из 14 элемента 8 (отредактировать код)»

textual
Листинг программы
    mov si,8*2      ;8 элемент
    mov ax, A[si]       ;взять 8 элемент
    mov si,14*2     ;14 элемент
    sub A[si], ax   ;вычесть 8 элемент

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


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

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

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