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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 23:49   #1
hodok93
Новичок
Джуниор
 
Регистрация: 17.11.2011
Сообщений: 2
Восклицание Доделать задачу на assembler - четное число уменьшено в два раза без использования операции деления

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

У меня получилось только определить сколько в массиве четных чисел (их количество).

Код:
.386
.model flat, stdcall
option casemap: none
 include \masm32\include\windows.inc
 include \masm32\include\kernel32.inc
 include \masm32\include\user32.inc
 includelib c:\masm32\lib\kernel32.lib
 includelib c:\masm32\lib\user32.lib
 iprint PROTO :DWORD
iprintln PROTO :DWORD

 .data
 cFNPrompt        db " ",13,10
 cFNPrompt2       db " ",13,10
  cbFNPrompt      dd  sizeof cFNPrompt 
  hStdOut         dd 0
  dwBytes         dd 0
  szAppName       db "input   ",0
  hStdIn          dd 0
  massiv          dd 3,9,3,4,41,13
    kol_even                 dd 0
.code
main PROC 
; 
	invoke CharToOem, Addr cFNPrompt2, Addr cFNPrompt  
      invoke FreeConsole ; освободить консоль
	invoke AllocConsole ; добавить консоль	
	Invoke GetStdHandle, STD_OUTPUT_HANDLE
	Mov hStdOut,EAX
            
	Invoke GetStdHandle, STD_INPUT_HANDLE
	Mov hStdIn,EAX
           Mov EAX, 0
           invoke iprint, EAX
           invoke SetConsoleTextAttribute, hStdOut, 10011111B  

lea ebx, massiv
mov ecx, 6 ;
v1:     push ecx	
invoke iprintln,[ebx] ;
 

 and byte ptr [ebx],1
jne odd
inc kol_even
odd:  add ebx, 4     

pop ecx
loop v1
invoke iprintln,kol_even

Invoke WriteConsoleA,hStdOut, Addr cFNPrompt, cbFNPrompt, Addr dwBytes, 0
;	ожидание ввода символов
	Invoke ReadConsole, hStdIn, Addr szAppName, 10, Addr dwBytes, 0
  	invoke ExitProcess,0
  	
  

main ENDP
include \masm32\include\iprint.inc
 include \masm32\include\iprintln.inc
end main
Помогите доделать задание, срочно нужно
hodok93 вне форума Ответить с цитированием
Старый 12.05.2012, 10:22   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
LEA esi, [massiv]
MOV ecx, [mlength]

xloop:   
   JECXZ donelab

   LODSD

   SUB ecx, 1
   SHR eax, 1
   JC xloop
 
   MOV [esi-4], eax
JMP xloop

donelab:
f.hump вне форума Ответить с цитированием
Старый 30.05.2012, 22:53   #3
hodok93
Новичок
Джуниор
 
Регистрация: 17.11.2011
Сообщений: 2
По умолчанию

Спасибо, программа работает.
Но требуется следующее:
1) Цикл переписать через loop
2) команду LODSD убрать, заменить на mov

Помогите, пожалуйста..
hodok93 вне форума Ответить с цитированием
Старый 30.05.2012, 23:44   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

я то, конечно, мог бы и переписать, но LOOP не люблю.

ну, и надо учиться, хоть немного. у вас есть работающий код, знаете что он делает, знаете что делает MOV, знаете как работает LOOP. даже не знаю чем еще тут помочь.
f.hump вне форума Ответить с цитированием
Старый 31.05.2012, 08:33   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
lea esi, massiv
mov ecx, offset kol_even
sub ecx, offset massiv
shr ecx, 2

a:

mov eax, dword ptr [esi]
test eax, 1
jnz lp

shr eax, 1
mov [esi], eax

lp:

add si,4
loop a
должно работать...

Цитата:
LOOP не люблю
а зря... с точки зрения процессора он работает быстрее...
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 31.05.2012 в 08:36.
DiemonStar вне форума Ответить с цитированием
Старый 31.05.2012, 10:15   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Может быть, правильнее было бы sar использовать для деления на 2? Иначе знак можно потерять.
vadimych вне форума Ответить с цитированием
Старый 31.05.2012, 12:37   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

vadimych, читаем внимательно задание
Цитата:
Из массива целых положительных чисел создать новый массив
поэтому подойдут и SAR, и SHR
Mikl___ вне форума Ответить с цитированием
Старый 31.05.2012, 14:00   #8
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Mikl___, просмотрел, нет внимания. Пора ноотропил употреблять.
vadimych вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Четное или нечетное число turtles Общие вопросы по Java, Java SE, Kotlin 3 25.08.2011 08:54
Дано число a. Как определить, четное оно, или нечетное? pahanzona Общие вопросы Delphi 5 09.03.2011 12:49
два раза к одной таблице Kolik317 SQL, базы данных 2 26.12.2009 13:58
слово пишется два раза INDY-SAVER Microsoft Office Word 2 18.11.2009 23:49
Как узнать что число не Float(без остатка) при результате деления? zotox Помощь студентам 7 19.07.2009 15:49