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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2009, 18:17   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию инвертирование(asm80836)

Код:
.intel_syntax noprefix
.global invert
.type invert, @function

invert:
        push ebx
	push ecx

	mov ebx, [esp+12]  # *a
	mov ecx, [esp+16]  # size_a

	cmp ecx, 0
	je end	
	
cycle:
	mov al,-1
	mov edx, [ebx+ecx-1]
	mul edx
	mov [ebx+ecx-1],al
	loop cycle

	mov eax,ebx
	pop ebx
	pop ecx
	ret

end:
        mov eax, ebx
	pop ebx
	pop ecx
	ret

препод сказал, что она неправильно работает при нулевом размере массива. Сделал условие на проверку размера если 0 , то возвращает указатель на массив который в аргументе. Что здесь не так ?

Последний раз редактировалось NiCola999; 20.11.2009 в 18:43.
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 19:28   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

А что не так? Только лишние 4 строки...
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 20.11.2009, 20:30   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

почемуто у препода неправильно она работает с нулевым размером. У него там какойто массив и он вызывает функцию от масива и размер 0 и ему выдаются какие-то числа странные... сам проверял , нормально возвращает указатель на 1 элемент при size=0
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 20:36   #4
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
А что не так? Только лишние 4 строки...
не 4 гораздо больше

Код:
cycle:
	mov al,-1
	mov edx, [ebx+ecx-1]
	mul edx
	mov [ebx+ecx-1],al
	loop cycle
странный код
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 20.11.2009, 21:00   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

че тут странного?

Код:
cycle:
	mov al,-1                  # al = -1 (8битная, т.к элемент char) 
	mov edx, [ebx+ecx-1] # edx = a[i]
	mul edx                    # al = edx*al ( a[i]*=-1)
	mov [ebx+ecx-1],al    # a[i] = al
	loop cycle
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 21:04   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Элемент char, а умножаете как long int. edx он 32разрядный.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 20.11.2009, 21:11   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

можно конечно всё в 8битные занести, в edx заносится 8битное число и оно спокойно умножается на al. Причем тут вообще это всё. Функция инвертирования массива прекрасно работает, я спрашиваю что она должна вернуть, если размер массива будет 0. Если убрать cmp ecx,0... (проверку на размер) то при ecx=0 программа выдает ошибку сегментации.


ошибка я думаю связана с тем, что loop даже если ecx=0 выполнится всегда 1 раз. И при выполнении в edx заносится не то что надо
mov edx, [ebx+0-1]

Последний раз редактировалось NiCola999; 20.11.2009 в 21:21.
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 21:23   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

А зачем убирать эту проверку ?
Понятно, что у вас стоит [ebx+ecx-1] значит при ecx=0, программа будет обращаться к байту, который не входит в массив. Да и loop будет выполнятся далеко не 1 раз.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 20.11.2009 в 21:27.
Goodwin98 вне форума Ответить с цитированием
Старый 20.11.2009, 21:29   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

так что функция должна вернуть при ecx=0.
NiCola999 вне форума Ответить с цитированием
Старый 20.11.2009, 21:31   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Если убрать проверку, то ошибку времени выполнения Access violation
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив, инвертирование Branbal Помощь студентам 6 16.11.2010 09:16
инвертирование строки julia23 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 12.11.2007 10:36