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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2011, 08:42   #1
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию Assembler. Битовые операции.

Дали задачку по ассемблеру.

Дано пятизначное число. (Может быть например такое 00001). С помощью битовых операций запишите его в ячейку памяти минимального размера. Запрашивать число можно на Паскале.

Писать надо ассемблерными вставками, но я саму задачу понять не могу. Само число изначально десятичное или двоичное? Можно с помощью bsr определить положение первого бита в числе, а что дальше? Я вот не понимаю как записать в память, т.е. что именно требуется? Создать в зависимости от положения бита переменную нужного размера или как? Хелп пипл!
artemonary вне форума Ответить с цитированием
Старый 10.05.2011, 10:59   #2
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию

Неужели никто не знает, как это реализуется?
Я бы сам сделал, но понять не могу как можно добиться "С помощью битовых операций запишите его в ячейку памяти минимального размера"? Мне не надо готового решения, просто пальцем ткнуть в направлении решения.
artemonary вне форума Ответить с цитированием
Старый 10.05.2011, 11:35   #3
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

допустим что твое число в eax, используем 4 байта так как в два может не поместится, в edx - адрес ячейки


Код:
mov ebx, eax; сохраним пока
and eax, $ffff0000
test eax, eax
jnz DWORDMOV ; в два байта не уложились записываем в ячейку 4 байта
mov eax, ebx 
and ax, $ff00
test ax, ax
jnz WORDMOV ; не уложились в 1 байт
mov [edx], bl
jmp exitproc
WORDMOV:
mov [edx], bx
jmp exitproc
DWORDMOV:
mov [edx], ebx
exitproc:
возможны где то косяки не проверял, но думаю принцип понятен
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 10.05.2011, 19:18   #4
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Swarog Посмотреть сообщение
допустим что твое число в eax, используем 4 байта так как в два может не поместится, в edx - адрес ячейки


Код:
mov ebx, eax; сохраним пока
and eax, $ffff0000
test eax, eax
jnz DWORDMOV ; в два байта не уложились записываем в ячейку 4 байта
mov eax, ebx 
and ax, $ff00
test ax, ax
jnz WORDMOV ; не уложились в 1 байт
mov [edx], bl
jmp exitproc
WORDMOV:
mov [edx], bx
jmp exitproc
DWORDMOV:
mov [edx], ebx
exitproc:
возможны где то косяки не проверял, но думаю принцип понятен
Всё ясно, кроме одного. Сказано записать в "ячейку памяти", а у вас в коде заносится в регистр, или я не прав? Запись [edx] указывает на адрес регистра?

Последний раз редактировалось artemonary; 10.05.2011 в 19:20.
artemonary вне форума Ответить с цитированием
Старый 10.05.2011, 19:20   #5
malinoff
Форумчанин
 
Аватар для malinoff
 
Регистрация: 08.01.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от artemonary Посмотреть сообщение
Всё ясно, кроме одного. Сказано записать в "ячейку памяти", а у вас в коде заносится в регистр, или я не прав?
Регистр (цифровая техника) — последовательностное логическое устройство, используемое для хранения n-разрядных двоичных чисел и выполнения преобразований над ними.

Так что регистр и есть ячейка памяти.
Если помог - кликни на значок весов под аватаром.
malinoff вне форума Ответить с цитированием
Старый 10.05.2011, 19:24   #6
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию

Swarog
Спасибо!

malinoff
Спасибо, земляк!
artemonary вне форума Ответить с цитированием
Старый 11.05.2011, 08:52   #7
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Swarog Посмотреть сообщение
Код:
mov [edx], bl
mov [edx], bx
mov [edx], ebx
Хм, ругается на запись такого вида.

думаю так будет тоже правильно?
Код:
mov dl, bl
mov dx, bx
mov edx, ebx
Или я не прав?
artemonary вне форума Ответить с цитированием
Старый 11.05.2011, 09:15   #8
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

нет не правильно, в дх у нас адрес ячейки памяти и запись в угловых скобках указывает на косвенную адресацию. если на тот пример ругается попробуй так

Код:
mov byte ptr [edx], bl
mov word ptr [edx], bx
mov dword ptr [edx], ebx
надо просто было указать размер ячейки
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 11.05.2011, 10:53   #9
artemonary
Пользователь
 
Регистрация: 20.04.2011
Сообщений: 11
По умолчанию

странно, всё равно ругается, или надо изначально задать адрес в edx?
Код:
	_asm {
		mov eax, x
		mov edx, 0

		test eax,0ffff0000h
		jnz dwtest

		test ax, 0ff00h
		jnz wtest

		mov byte ptr [edx], al
		jmp ended
		
		dwtest:
		mov dword ptr [edx], eax
		jmp ended
		
		wtest:
		mov word ptr [edx], ax
		jmp ended

		ended:
	}
Вот вся асм-вставка. За её пределами только запрашивается x.

Последний раз редактировалось artemonary; 11.05.2011 в 11:00.
artemonary вне форума Ответить с цитированием
Старый 11.05.2011, 11:07   #10
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

ага это необходимо просто сделать, иначе он пытается писать по адресу 0 в твоем случае, а это адресное пространство не твоей программы, поэтому и ругается
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции _-Re@l-_ Свободное общение 12 11.07.2010 15:31
Битовые операции СИ savra Помощь студентам 0 10.03.2010 19:31
Битовые операции(С) Александр Елис Помощь студентам 11 16.02.2010 21:11
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40