Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 15:28   #1
Александр16
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 12
По умолчанию Турбо ассемблер - построить массив путём сдвига исходного массива и умножить все элементы полученного массива на два

Дан массив Y1...Y20, построить массив Z1..Z20, элементы которого соответствуют элементам Yi, сдвинутым на одну позицию, т.е. Z1=Y2, Z2=Y3,...Z20=Y1. Умножить все элементы Zi на 2.
НИКАК НЕ ПОЛУЧАЕТСЯ СДВИНУТЬ ЭЛЕМЕНТЫ МАССИВА ПОМОГИТЕ ПОЖАЛУЙСТА.

Код:
title laba8
codsg segment para 'code'
        org 100h
        assume cs:codsg,ds:codsg,ss:codsg,es:nothing
begin proc
kurs    macro   x,y
                mov             ah,02
                mov             bh,00
                mov             dh,x
                mov             dl,y
                int             10h
        endM
 
vvod    macro   x
                mov             ah,0ah
                lea             dx,x
                int             21h
        endM
 
vivod   macro   x
                mov     ah,09
                lea     dx,x
                int     21h
                endM
 
;zadanie
;ekran
 
                mov     ah,00
                mov     al,03
                int     10h
 
                kurs    4,30
                vivod   vvodmas
;vvod massiva
                mov     cx,10
                mov     di,0
 
m20:
                kurs    7,n
                mov             ah,0ah
                lea             dx,data
                int             21h
                push    cx
 
                call    ascbin
                mov             ax,binv
                mov             mas[di],ax
 
                add             di,2
                pop             cx
                add             n,5
                loop    m20
 
;sdvig
 
        
mov     di,0
mov cx,10  
 
                cld                                    
                                lea             di, mas
                                lea             si, mas2
                                lodsb                         
                               rep movsb                      
                               stosb

                kurs    14,35
                vivod   vivodmas
 
;vivod massiva
        mov     cx,10
        mov     di,0
        mov     n,10
 
m30:
        mov     asci,' '
        mov     asci+1,' '
        mov     asci+2,' '
                        push    cx
                        kurs    17,n
                        mov             ax,mas2[di]
                        mov             binv,ax
                        call    binasc
                        mov             ah,09
                        lea             dx,asci
                        int             21h
                        
                        add             di,2
                        add             n,5
                        pop             cx
                        loop    m30
 
                        mov             ah,00
                        int             16h
                        int             20h
                        ret
begin   endp
 
ascbin  proc
mov     mul10,1
        mov     binv,0
        mov     cx,10
        lea     si,number-1
        xor     bx,bx
        mov     bl,real
b20:    mov     al,[si+bx]
        and     ax,000fh
        mul     mul10
        add     binv,ax
        mov     ax,mul10
        mul     cx
        mov     mul10,ax
        dec     bx
        jnz     b20
        mov     ax,0
        mov     ax,binv
        ret
ascbin  endp
;------------
BinASC  proc
        mov     cx,10
        lea     si,asci-1
        mov     bx,3
        mov     ax,binv
c20: cmp        ax,0010
        jb      c30
        xor     dx,dx
        div     cx
        or      dl,30h
        mov     [si+bx],dl
        dec     bx
        jmp     c20
c30: or al,30h
        mov     [si+bx],al
        ret
BinAsc  endP
 
Data    label   byte
max             db      5
real    db      ?
number  db      3 dup(' '),'$'
asci    db      3 dup(' '),'$'
mul10   dw      1
binv    dw      0
n               db      10
i               dw      0
mas             dw      10 dup(0)
mas2    dw      10 dup(0)
y               dw      18
vvodmas db      'Vvedite elementi massiva','$'
vivodmas db     'noviy massiv','$'
cosg    ends
end     begin

________
1) Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.

2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)

Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 11.02.2012 в 15:52.
Александр16 вне форума Ответить с цитированием
Старый 11.02.2012, 15:46   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

я бы сдвиг организовал как-то так:

Код:
jmp sdvig
Z db 0
Y db 20 dup(0)
sdvig:
mov ax, byte ptr [Y + 20]
mov Z, ax
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 11.02.2012, 16:10   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

[QUOTE=Александр16;978682]Дан массив Y1...Y20, построить массив Z1..Z20, элементы которого соответствуют элементам Yi, сдвинутым на одну позицию, т.е. Z1=Y2, Z2=Y3,...Z20=Y1. Умножить все элементы Zi на 2.
НИКАК НЕ ПОЛУЧАЕТСЯ СДВИНУТЬ ЭЛЕМЕНТЫ МАССИВА ПОМОГИТЕ ПОЖАЛУЙСТА.
%0
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 11.02.2012 в 16:17.
Сыроежка вне форума Ответить с цитированием
Старый 11.02.2012, 17:04   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

но лучше сделать так:

Код:
.386
cseg segment para
       assume cs:cseg, ds:cseg, es:cseg
       org 100h

start:
       jmp begin

Z db 20 dup (0)
Y db 20 dup (0)
begin
       ....; заполняем исходный массив
       lea di, Z
       lea si, Y
       inc si ; сдвиг в массивах
       mov cx, 19
cyc:
       lodsb     ; Y[2..20] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al
       loop cyc
       lea si, Y  
       lodsb      ; Y[1] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al
       ....; выводим результат
       ret  
ends cseg
       end start
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 11.02.2012, 20:28   #5
Александр16
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 12
По умолчанию почему выводит одни 0?

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
но лучше сделать так:

Код:
.386
cseg segment para
       assume cs:cseg, ds:cseg, es:cseg
       org 100h

start:
       jmp begin

Z db 20 dup (0)
Y db 20 dup (0)
begin
       ....; заполняем исходный массив
       lea di, Z
       lea si, Y
       inc si ; сдвиг в массивах
       mov cx, 19
cyc:
       lodsb     ; Y[2..20] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al
       loop cyc
       lea si, Y  
       lodsb      ; Y[1] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al
       ....; выводим результат
       ret  
ends cseg
       end start
Код:
title laba8
codsg segment para 'code'
	org 100h
	assume cs:codsg,ds:codsg,ss:codsg,es:nothing
begin proc
kurs	macro	x,y
		mov		ah,02
		mov		bh,00
		mov		dh,x
		mov		dl,y
		int		10h
	endM

vvod	macro	x
		mov		ah,0ah
		lea		dx,x
		int		21h
	endM

vivod	macro	x
		mov	ah,09
		lea	dx,x
		int	21h
		endM

;zadanie
;ekran

		mov	ah,00
		mov	al,03
		int	10h

		kurs	4,30
		vivod	vvodmas
;vvod massiva
		mov	cx,20
		mov	si,0

m20:
		kurs	7,n
		mov		ah,0ah
		lea		dx,data
		int		21h
		push	cx

		call	ascbin
		mov		ax,binv
		mov		y[si],ax

		add		si,2
		pop		cx
		add		n,3
		loop	m20

;sdvig

mov	di,0
mov	si,0

       lea di,Z
       lea si,Y
       inc si 
       mov cx,19
cyc:
       lodsb     ; Y[2..20] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al
       loop cyc
       lea si, Y  
       lodsb      ; Y[1] -> al
       shl al,1   ; al*2
       stosb     ; Z[1..19] <- al

;vivod massiva
	mov	cx,20
	mov	di,0
	mov	n,5

m30:
	mov	asci,' '
	mov	asci+1,' '
	mov	asci+2,' '
			push	cx
			kurs	17,n
			mov		ax,Z[di]
			mov		binv,ax
			call	binasc
			mov		ah,09
			lea		dx,asci
			int		21h

			add		di,2
			add		n,4
			pop		cx
			loop	m30

			mov		ah,00
			int		16h
			int		20h
			ret
begin	endp

ascbin	proc
mov	mul10,1
	mov	binv,0
	mov	cx,10
	lea	si,number-1
	xor	bx,bx
	mov	bl,real
b20:	mov	al,[si+bx]
	and	ax,000fh
	mul	mul10
	add	binv,ax
	mov	ax,mul10
	mul	cx
	mov	mul10,ax
	dec	bx
	jnz	b20
	mov	ax,0
	mov	ax,binv
	ret
ascbin	endp
;------------
BinASC	proc
	mov	cx,10
	lea	si,asci-1
	mov	bx,3
	mov	ax,binv
c20: cmp	ax,0010
	jb	c30
	xor	dx,dx
	div	cx
	or	dl,30h
	mov	[si+bx],dl
	dec	bx
	jmp	c20
c30: or al,30h
	mov	[si+bx],al
	ret
BinAsc	endP

Data	label	byte
max		db	5
real	db	?
number	db	3 dup(' '),'$'
asci	db	3 dup(' '),'$'
mul10	dw	1
binv	dw	0
n		db	5

i		dw	0
y	dw	20 dup(0)
z	dw	20 dup(0)
vvodmas db	'Vvedite elementi massiva','$'
vivodmas db	'noviy massiv','$'
cosg	ends
end	begin
Александр16 вне форума Ответить с цитированием
Старый 12.02.2012, 20:30   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Наверное потому, что вы не адаптировали мой код под свои нужды. В моём примере был массив байтов, а в вашем - массив слов, поэтому, логичнее было бы использовать 16-разрядные регистры и lodsw, stosw и т.д.

Поскольку числа вы вводите явно в десятичном формате (я предпочитаю 16-ричный - меньше проблем с переводом), то логичнее было бы производить вычисления в BCD, чем переделывать в двоичный код. И учитесь пользоваться дебаггером - это сильно упрощает процесс отладки.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 12.02.2012 в 20:33.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из исходного массива заполнить два других массива DarkStalkerus Паскаль, Turbo Pascal, PascalABC.NET 1 14.12.2011 14:19
Элементы матрицы. Все ненулевые элементы массива D(k) расположить в начале массива E(k) и подсчитать их к Вася Маклауд Помощь студентам 0 03.04.2011 17:21
дан целочисленный массив N. Удалить из массива все элементы,встречающиеся [менее двух раз]1 Zevsnet Паскаль, Turbo Pascal, PascalABC.NET 6 16.01.2011 18:01
Построить массив, в который поместить все элементы второго массива, оканчивающиеся на цифру 5 Паскалька^^ Паскаль, Turbo Pascal, PascalABC.NET 11 07.01.2009 02:54