Из элементов целочисленного вектора С ( п) , п < 12 кратных заданному целому числу Т , сформировать вектор В - Assembler
Формулировка задачи:
Обеспечить обработку данных массивов в виде отдельной процедуры.
Возникает ошыбка при перезписи в другой масив . пожалуста помогите доделать.
.MODEL small
.STACK 256
.data
array dw 12 dup (?)
array2 dw 12 dup (?)
t db 3
.code
.486
main:
ProgramStart PROC NEAR
mov ax,@data
mov ds,ax
mov es,ax
mov cx,12
lea di, array
cld
go:
mov al, cl
stosb
loop go
mov cx,12
lea si, array
mov ah,02h
show:
lodsb
mov dl, al
add dl,30h
int 21h
loop show
mov si,1
mov esi,0
mov ax,array[esi*2]
perevirka:
div t
cmp ah, 0
inc esi
cmp esi, 12
je zeror
jnz masb
masb:
mov bx, array[esi*2]
mov array2[si*2],bx
inc si
cmp esi, 12
je zeror
jnz perevirka
zeror:
sho:
mov bx,OFFSET array2
call PrintSg
;lea dx,array2
; mov ah,09h
; int 21h
;
; mov cx,12
; mov si,0
exit:
mov ax,4c00h
int 21h
ProgramStart ENDP
PrintSg PROC NEAR
mov dx,[bx]
mov ah,09h
int 21h
mov cx,12
mov si,0
ret
PrintSg ENDP
end mainРешение задачи: «Из элементов целочисленного вектора С ( п) , п < 12 кратных заданному целому числу Т , сформировать вектор В»
textual
Листинг программы
org 100h
jmp start
mess0 db 13,10,'Vector(C): $'
mess1 db 13,10,'Vector(B): $'
vectC db 1,0,6,3,9,5,2,7,8,9,3,6
len = $ - vectC ; длина источника
vectB db 12 dup('$') ; приёмник (с маркером fn.9)
divT db 3 ; делитель
start:
mov dx,mess0 ; параметр
call MESSAGE ;
mov si,vectC ; параметр
call PRINT ;
;=====================================
mov si,vectC ; параметры
mov di,vectB ; ^^
call MOD_PROG ;
;=====================================
mov dx,mess1 ;
call MESSAGE ;
mov dx,vectB ;
call MESSAGE ;
exit: ;
xor ax,ax ;
int 16h ;
int 20h ; выход!
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
MESSAGE: ;
mov ah,9 ;
int 21h ;
RET ;
;-------------------------------------------------------------------
; Процедура переводит числа 0-9 в символы
; и выводит их на экран. На входе: SI - буфер с числами
PRINT: ;
mov cx,len ;
@@: ;
lodsb ;
or al,30h ; перевод числа в символ
int 29h ;
loop @b ;
RET ;
;-------------------------------------------------------------------
; Процедура вычисляет MOD числа
; На входе: SI - источник, DI - приёмник
MOD_PROG: ;
mov cx,len ; длина массива
mov bl,[divT] ; делитель
@@: ;
lodsb ; берём число..
cmp al,bl ; если оно меньше делителя,
jb next ; ..то пропускаем его
mov bh,al ; иначе: запоминаем
xor ah,ah ; взводим флаг ZERO
div bl ; вычисляем остаток
or ah,ah ; проверка на нуль
jnz next ; пропускаем, если есть остаток
mov al,bh ; иначе: возвращаем число в AL
or al,30h ; переводим его в символ,
stosb ; ..и сохраняем в приёмнике
next: ;
loop @b ; мотаем цикл СХ-раз..
RET ;