Вычесть из 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 элемент
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д