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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2008, 18:00   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Восклицание Построить одномерный массив

Никак немогу переделать заготовки под свой вопрос(хоть и понимаю что надо), на TASM!
Суть задачи: По данному массиву целых чисел найти их минимум и построить массив, элементы которого равны разности исходных элементов и полученного минимума;
___________________________________ _____________________________
На Pascal сделал, но там убрал минусы от чисел типа Word(иначе некомпилилось).
На Pascal`e:
Код:
Const a :Array[0..9] of Word = (2,3,4,7,9,8,9,1,5,2);
      n = 10;
Var b :array[0..9] of word;
    I :Word;
    Min :Word;
begin
 Min := a[0];
 For I:=0 To n-1 Do
  IF Min>=a[I] Then
   Min := a[I];

 For I:=0 To n-1 Do
  b[I] := a[I] - Min;

For I:=0 To n-1 Do
 Write( b[I] );

end.
А как сделать то же самое, но на TASM(!)?
Вот исходный текст на TASM(только с отрицательными числами как быть, там же Word(0 .. 65535 (Word))):
Код:
assume cs:mycode, ds:mydate, ss:mystack, es:mydate

mycode segment para
start:
 	push 	ds
	xor 	ax,ax
	push 	ax
	mov 	ax,seg mydate
	mov	ds,ax
	xor	si,si
	mov	di,si
	mov	sum,si
	mov	cx,n

cycl:	mov 	bx,seg a
	mov	es,bx
	mov	bx,offset a
	mov	dx,si
	shl	dx,1
	add	bx,dx
	mov	ax, word ptr es:[bx]
	cmp	ax,zero
	jl	ifless
	add 	ax,ax
	jmp	summa
ifless:	mov	ax,zero
summa:	mov 	bx,seg a
	mov	es,bx
	mov 	bx,offset a
	mov	dx,di
	shl	dx,1
	add	bx,dx
	mov	word ptr es:[bx],ax
	add	ax,sum
	mov	sum,ax
	inc	si
	inc	di
	loop	cycl

	 ; Вывод значений массива
	mov ah, 9
	mov dx, offset a
	int 21h
	 ; Вывод

	retf
mycode 	ends

mydate 	segment para
	n	dw	10
	a	dw	2,3,4,7,-9,8,9,1,-5,-2 ; 10 Штук
	sum	dw	?
	zero	dw	0
	min	dw	? ; минимальный элемент массива "a" будет храниться здесь
	mas  db 11 dup(?),'$' ; сюда засунем выходной массив
mydate 	ends	

mystack	segment para stack 'stack'
	dw 100 dup (?)
mystack	ends
	end start

Последний раз редактировалось Alter; 23.03.2008 в 18:03.
Alter вне форума Ответить с цитированием
Старый 23.03.2008, 19:21   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Со знаками разбирается уже JMP. Именно поэтому он бывает JAE, а бывает JGE. И честно говоря, не понял что там происходит
со всеми этими "shl dx,1" и "cmp ax,zero".

/*---------------------------
И ещё на
Код:
mas  db 11 dup(?),'$' ; сюда засунем выходной массив
обратите внимание, у него другой размер.
-----------------------------*/
Сорри, тормознул, это не нужно...

не проверяя набросал вот так:
Код:
; Поиск минимума
			lea		si, A
			mov		ax, ds:[si]
			add		si, 2
			mov		cx, array_len - 1 ; array_len - условно говоря, у Вас это 10
min_find_loop:
			cmp		ax, ds:[si]
			jge		_GE
			mov		ax, ds:[si]
_GE:
			add		si, 2
			loop	min_find_loop

;	min находится в AX

; Вычитание в тот же массив
			lea		si, A
			mov		cx, array_len
sum_loop:
			mov		bx, ds:[si]
			sub		bx, AX
			mov		ds:[si], bx
			add		si, 2
			loop	sum_loop

; Вычитание в другой массив
			lea		si, A
			lea		di, B
			mov		cx, array_len
sum_loop:
			mov		bx, ds:[si]
			sub		bx, ax
			mov		ds:[di], bx
			add		si, 2
			add		di, 2
			loop	sum_loop
Подправьте, если нужно, что там у Вас с сегментами.

Последний раз редактировалось B_N; 23.03.2008 в 19:46.
B_N вне форума Ответить с цитированием
Старый 23.03.2008, 19:53   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Цитата:
Сообщение от B_N Посмотреть сообщение
Цитата:
................................... .....
mas db 11 dup(?),'$' ; сюда засунем выходной массив
................................... .....
обратите внимание, у него другой размер.
Это опечатка у меня вышла, там было DW: mas dw 10 dup(?),'$' ;

Код посмотрю, попробую пристроить. Потом напишу как прошла операция.
Alter вне форума Ответить с цитированием
Старый 23.03.2008, 19:59   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Это опечатка у меня вышла, там было DW: mas dw 10 dup(?),'$' ;
Нет-нет-нет, не нужно, это у меня уже глаза замылились, я выше исправил, извиняюсь ещё раз.
B_N вне форума Ответить с цитированием
Старый 24.03.2008, 22:31   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Вопрос

[TASM! - Only]
Я запутался в программе. Невыводится ни один из массивов на экран. Что теперь не так у меня, может нетуда вставил код, что особенного в массивах.
Любая помощь приветствуется.


Код:
assume cs:mycode, ds:mydate, ss:mystack, es:mydate

mycode segment para
Start:
 	push 	ds
	xor 	ax, ax
	push 	ax
	mov 	ax, seg mydate
	mov	ds, ax
	xor	si, si
	mov	di, si
		; Нужно ли - это здесь\/
	mov bx,seg a   
	mov es,bx   
	mov bx,offset a
		; Нужно ли - это здесь/\

; Поиск минимума
			lea		si, A
			mov		ax, ds:[si] ; ax := a[0]
			add		si, 2		; 
			mov		cx, array_len - 1 ; array_len = 10 - 1

min_find_loop:
			cmp		ax, ds:[si]
			jge		_GE
			mov		ax, ds:[si]
_GE:
			add		si, 2
			loop	min_find_loop    ; min находится в AX

; Вычитание в массив "a"
			lea		si, A
			mov		cx, array_len
sum_loop:
			mov		bx, ds:[si]
			sub		bx, AX
			mov		ds:[si], bx
			add		si, 2
			loop	sum_loop

; Вычитание в массив "B"
;			lea		si, A
;			lea		di, B
;			mov		cx, array_len
;sum_loop:
;			mov		bx, ds:[si]
;			sub		bx, ax
;			mov		ds:[di], bx
;			add		si, 2
;			add		di, 2
;			loop	sum_loop

	 ; Вывод значений массива "a"
	mov ah, 9
	mov dx, offset a
	int 21h
	 ; Вывод

	 ; Вывод значений массива "b"
	;mov ah, 9
	;mov dx, offset b
	;int 21h
	 ; Вывод


	retf
mycode 	ends

mydate 	segment para
	array_len	dw	10
	a	dw	2,3,4,7,-9,8,9,1,-5,-2,'$' ; 10 Штук
	B  dw 10 dup(?),'$'
mydate 	ends	

mystack	segment para stack 'stack'
	dw 100 dup (?)
mystack	ends
	end start
Alter вне форума Ответить с цитированием
Старый 25.03.2008, 00:39   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
[TASM! - Only]
Я запутался в программе. Невыводится ни один из массивов на экран. Что теперь не так у меня, может нетуда вставил код, что особенного в массивах.
Любая помощь приветствуется.
В общем, то ли Вы сами запутались, то ли я Вас вчера запутал, но выводите-то Вы не текст, а числа! Ладно, будем исправляться.
Код:
array_len		equ		10

				assume 		cs:mycode, ds:mydate, ss:mystack, es:mydate
mycode			segment para
Start:
	 			push 	ds
				xor 	ax, ax
				push 	ax
				mov 	ax, seg mydate
				mov		ds, ax

; Поиск минимума
				lea		si, word ptr ARRAY_A
				mov		ax, ds:[si] 
				add		si, 2		
				mov		cx, array_len
				dec		cx

min_find_loop:
				cmp		ax, ds:[si]
				jle		AX_LE
				mov		ax, ds:[si]
AX_LE:
				add		si, 2
				loop	min_find_loop    			
; min находится в AX

				push	ax
				push	ax

				mov		ax, 0900h
				lea		dx, MinHead
				int		21h

				pop		ax
				call	PRINT_INT

				mov		ax, 0900h
				lea		dx, CRLF
				int		21h

				pop		ax

; Вычитание в массив "B"
				lea		si, ARRAY_A
				lea		di, ARRAY_B
				mov		cx, array_len
sub_loop:
				mov		bx, ds:[si]
				sub		bx, AX
				mov		ds:[di], bx
				add		si, 2
				add		di, 2
				loop	sub_loop


				mov		ax, 0900h
				lea		dx, ArgHead
				int		21h
				
				mov		ax, array_len
				lea		bx, ARRAY_A
				call	PRINT_ARRAY

				mov		ax, 0900h
				lea		dx, CRLF
				int		21h

				mov		ax, 0900h
				lea		dx, ResultHead
				int		21h
				
				mov		ax, array_len
				lea		bx, ARRAY_B
				call	PRINT_ARRAY

				retf

PRINT_ARRAY		proc	near
				; DS:BX - адрес массива
				; AX - число элементов
				push	cx
				
				mov		cx, ax

				mov		ax, [bx]
				call	PRINT_INT
				add		bx, 2
				
				mov		cx, array_len
				dec		cx
loop_print:				
				lea		dx, Comma
				mov		ax, 0900h
				int		21h
				mov		ax, [bx]	
				call	PRINT_INT
				inc		bx
				inc		bx
				loop	loop_print
				
				pop		cx
				retn
PRINT_ARRAY		endp

PRINT_INT		proc	near
				; AX    - число
				push	di
				push	cx
				push	dx
				push	bx
				
				lea		di, byte ptr String
				add		di, 10
				mov		byte ptr ds:[di], '$'
				dec		di
				
				test	ax, ax
				jnz		start_itoa
				mov		byte ptr ds:[di], '0'
				dec		di
				jmp		print_string		
start_itoa:
				mov		bx, ax
				mov		cx, 10
loop_div:
				test	ax,ax
				jz		end_div
				cwd
				idiv	cx
				jns		positive
				neg		dx
positive:				
				add		dl, '0'
				mov		ds:[di], dl
				dec		di
				jmp		loop_div
end_div:
				test	bx, bx
				jns		print_string
				mov		byte ptr ds:[di], '-'
				dec		di
		
print_string:
				mov		dx, di
				inc		dx
				mov		ax, 0900h
				int		21h	

				pop		bx
				pop		dx
				pop		cx
				pop		di

				retn
PRINT_INT		endp
				
mycode 			ends

mydate 			segment para
	ARRAY_A		dw		2, 3, 4, 7, -9, 8, 9, 1, -5, -2	; 10 Штук
	ARRAY_B		dw		10 dup(?)
	Comma		db		', $'
	MinHead		db		'Minimum:  $'
	ArgHead		db		'Argument: $'
	ResultHead	db		'Result:   $'
	CRLF		db		10, 13, '$'
	String		db		16 dup(' ')
mydate 			ends	

mystack			segment para stack 'stack'
				dw 100 dup (?)
mystack			ends
				
				end start

Последний раз редактировалось B_N; 25.03.2008 в 14:10.
B_N вне форума Ответить с цитированием
Старый 28.03.2008, 20:01   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Решил упростить программку, т.к выходные числа получаются положительные целые. Выводить хотел в цикле, разбивая значения массива "b" на десятичное число и его части(Например: 25 => Cel:=25 div 10 => Modi:=25-(Cel*10) => Вывод_десятичной_части, вывод_остатка).
Опять ошибки появились.

Код:
assume cs:mycode, ds:mydate, ss:mystack, es:mydate

mycode segment para
start: 
	push 	ds
	xor 	ax,ax
	push 	ax
	mov 	ax,seg mydate
	mov	ds,ax
; --------------------------------	
	lea	si, word ptr a
	mov	ax, ds:[si]
	add	si, 2
	mov	cx, n
	dec	cx

; -------Ищим минимум-------------
 Mini:
	cmp	ax, ds:[si]
	jle	Prg
	mov	ax, ds:[si]
  Prg:
	add	si, 2
 loop Mini
	mov min, ax ; в Min содержимое AX
; -------Вычитаем тут-------------
	lea	si, a
	lea	di, b
	mov cx, n
 GoB:
	mov	bx, ds:[si]
	 sub	bx, min
	mov	ds:[di], bx
	 add	si, 2
	 add	di, 2
 Loop GoB
; -------Печать массива "b"-------
	lea	si, b
	mov	cx, n
Printr:
	mov	bx, ds:[si]
	 cmp	bx, 010 ; bx<10
	jnb Bol10 ; если число более 10
 ; bx>0 & bx<10
	mov	ah, 09
	 add	bx, 30h
	mov	dx, bx
	int	21h
	jmp	Exi
 Bol10: 
	mov	ax, 010	; bx:=25
	 div	bx	 ; Ax := Bx Div Ax | <== ругается на деление
	mov	Cel, AX  ; Часть целая помещается в Cel | например: 2
	Mov	Modi, Cel	; Modi:=2
	Mov	Ax, 10		; AX:=10
	 Mul	Modi		; Modi:=Modi*10 | => 20
	 Sub	bx, Modi  ; BX := BX - Modi | 25-20=5
	Mov	Modi, Bx ; Modi := BX | 5
	 ; -Десятичная часть----
	Mov	ah, 09
	 Add	Cel, 30h
	Mov	Dx, offset Cel
	Int	21h
	 ; ---------------------
	 ; -Остаток деления-----
	Mov	ah, 09
	 Add	Modi, 30h
	Mov	Dx, offset Modi
	Int	21h
	 ; -Пробел--------------
	Mov	Ah, 09
	Mov	Dx, Offset CC
	Int	21h
	 ; ---------------------
 Exi: ; КОНЕЦ
Loop Printr
; --------------------------------
	retf
mycode 	ends

mydate 	segment para
	n	dw	10
	a	dw	2,3,4,7,-9,8,9,1,-5,-2
	b	dw	10 dup(?),'$'	
	min	dw	?
	modi	dw	? ; остаток от bx
	cel	dw	? ; целое от bx
	CC	db	' ' ; ПРОБЕЛ
mydate 	ends
	
mystack	segment para stack 'stack'
	dw 100 dup (?)
mystack	ends
	end start
___________________________________ ______________________________
................................... ......
Alter вне форума Ответить с цитированием
Старый 29.03.2008, 01:42   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Решил упростить программку, т.к выходные числа получаются положительные целые. Выводить хотел в цикле, разбивая значения массива "b" на десятичное число и его части(Например: 25 => Cel:=25 div 10 => Modi:=25-(Cel*10) => Вывод_десятичной_части, вывод_остатка).
Опять ошибки появились.
Alter, ну честное слово, уже не знаю, дважды исправил Вам вывод, а Вы в третий раз пытаетесь выводить не строку однобайтовых символов, оканчивающуюся '$' (именно это делает девятая функция), а целое число, к тому же в слово размером. Кроме того
1. Когда делим на слово, то пара dx:ax делится на аргумент инструкции и в AX помещается результат деления, а в DX - остаток, не нужны там все эти "Modi" и "Cel", мало того, что там было перед делением в DX, что за новая инструкция деления на AX.... Вот ошибки и лезут.
2. С чего Вы взяли, что выводятся только положительные числа?
3. Если хотите выводить посимвольно, пользуйтесь второй или шестой функцией INT 21H.

Последний раз редактировалось B_N; 29.03.2008 в 01:55.
B_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двумерный массив случайных чисел. Построить одномерный из исходного, выбрав из него все числа кратные ProWinD Паскаль, Turbo Pascal, PascalABC.NET 2 16.06.2008 20:12
одномерный массив ldx Паскаль, Turbo Pascal, PascalABC.NET 4 06.06.2008 17:45
VBA. Одномерный массив ExMatiss Microsoft Office Excel 9 07.05.2008 05:57
одномерный массив fatdog Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 23.02.2008 10:05
Одномерный массив SkyDreamer Помощь студентам 1 01.12.2007 21:22