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

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

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

Восстановить пароль

Купить рекламу на форуме - 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