Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
#1

Как выйти из постоянного цикла и обнулить регистры в приведенном коде

13.12.2012, 01:20. Просмотров 1259. Ответов 10
Метки нет (Все метки)

Здравствуйте!
Помогите выйти из постоянного цикла и сделать, так чтобы после него обнулить регистры и получить флаг 0 с положительным значением.
Примерно, что я хотел воплотить

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.386
.model flat, stdcall
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto : DWORD
.code
start:
mov eax, 5
mov ecx, 3
proverka:
cmp eax, ecx
jmp sverka ; получаем бесконечный цикл
sverka:
inc ecx ; увеличиваем на 1
jmp sverka
zero:
sub eax,ecx ; обнуляем регистры
invoke ExitProcess, 0
end start
PS
Если несложно, то выложите также целиком весь код, ибо так проще, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2012, 01:20
Ответы с готовыми решениями:

Как организовать задержку в приведенном коде
Подскажите пожалуйста как организовать задержку в таком коде: CSEG segment...

Исправить ошибки в приведенном коде
Привет! Нашел на сайте пример. Вроде все компилится, все ок. Но не работает! Не...

Разделит ли функция div ah на bh в приведенном коде
xor ah,ah xor bh,bh xor ch,ch mov ax,p shr ax,2 mov bx,q shl bx,1 add...

Что произойдет с переменной в приведенном коде
Помогите! на защите лабы по ассемблеру, меня препод попросил написать там...

Что происходит с флагом переноса в приведенном коде
Добрый день. Возник вопрос: Что происходит с флагом переноса в такой...

10
Mikl___
Автор FAQ
11670 / 5995 / 536
Регистрация: 11.11.2010
Сообщений: 10,989
13.12.2012, 03:39 #2
grice88,
  • если везде стоят безусловные переходы jmp sverka то о каком выходе из цикла идет речь?
  • если eax=5 а ecx=3 при этом ecx увеличивается каждый раз на 1, а с еах в цикле ничего не делается, то каким образом регистры еах и есх должны обнулиться?
  • вот еще один "перл"
    Assembler
    1
    
    sub eax,ecx ; обнуляем регистры
    чтобы обнулить еах нужно сделать sub eax,eax то же самое относится к регистру ecx
1
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
13.12.2012, 09:54  [ТС] #3
если eax=5 а ecx=3 при этом ecx увеличивается каждый раз на 1, а с еах в цикле ничего не делается, то каким образом регистры еах и есх должны обнулиться?

что нужно дописать,чтобы перейти к отрицанию, а не оставаться в цикле?

а можно ж с помощью xor обнулить значения?
xor eax,ecx
0
Mikl___
Автор FAQ
11670 / 5995 / 536
Регистрация: 11.11.2010
Сообщений: 10,989
13.12.2012, 10:09 #4
grice88, xor eax,eax обнуляет значение в регистре ЕАХ, а вот
Цитата Сообщение от grice88 Посмотреть сообщение
xor eax,ecx
будет делать операцию "Исключающее ИЛИ" с содержимым регистра ЕАХ, а это разные операции
Цитата Сообщение от grice88 Посмотреть сообщение
что нужно дописать,чтобы перейти к отрицанию, а не оставаться в цикле?
внимательно перечитать лекцию, внутри тела цикла делать какие-то сравнения командой CMP и по результату сравнения выполнять или не выполнять условный переход в начало цикла
1
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
13.12.2012, 12:13  [ТС] #5
Ясно по xor!

Смотрите я сделал так

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.386
.model flat, stdcall
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto : DWORD
.code
start:
mov eax, 5
mov ecx, 5
sverka:
cmp eax, ecx
je zero ; переход если равны
zero:
invoke ExitProcess, 0
end start
0
Mikl___
Автор FAQ
11670 / 5995 / 536
Регистрация: 11.11.2010
Сообщений: 10,989
13.12.2012, 12:16 #6
grice88,
  • заключай свой код в тэги [АSM] и [/АSM]
  • переправь je zero на jne sverka
1
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
13.12.2012, 12:41  [ТС] #7
Сделал так

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.386
.model flat, stdcall
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto : DWORD
.code
start:
mov eax, 5
mov ecx, 5
sverka:
cmp eax, ecx
jne sverka ; переход если равны
zero:
sub eax,eax
sub ecx,ecx
invoke ExitProcess, 0
end start
Но в конец хочу добавить, так чтобы мне флаг Z изменился.
Пока картина такая
Как выйти из постоянного цикла и обнулить регистры в приведенном коде

т.е. флаг Z = 1 , а хочу на 0 сбросить.
Можете подсказать, какая команда может помочь в этом?
В ольге я знаю, что просто можно ткнуть на флаг и он поменяться
0
Mikl___
Автор FAQ
11670 / 5995 / 536
Регистрация: 11.11.2010
Сообщений: 10,989
13.12.2012, 13:16 #8
grice88,
  • не правильный комментарий
    jne sverka ; переход если eax и ecx не равны
  • если флаг ZF = 1 значит получен нулевой результат, это происходит когда sub eax,eax, добавь к ЕАХ например 5 и результат будет не нулевой (add eax,5)
  • и еще потерял команду inc ecx перед cmp eax, ecx иначе так из цикла никогда и не выйдешь
0
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
13.12.2012, 13:44  [ТС] #9
Дело в том, что если я запускаю пр-му в ольге, то там уже сразу флаг Z=1 и P=1
и даже в процессе пошагового выполнения пр-мы, ничего не изменяется.
ОС-винда 7-ка 32бит

*сейчас разберусь и отредактирую комментарий

Добавлено через 20 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.386
.model flat, stdcall
includelib C:\masm32\lib\kernel32.lib
ExitProcess proto : DWORD
.code
start:
mov eax, 5
mov ecx, 5
add eax, 2
sverka:
inc ecx
cmp eax, ecx
jne sverka ; переход если eax и ecx не равны
zero:
sub eax,eax
sub ecx,ecx
invoke ExitProcess, 0
end start
По коду всё работает, спасибо вам!
Но вопрос состоит в том, что после пошагового выполнения после выполнения цикла, т.е. когда ecx=7 eax =7 появляется флаг Z=1, почему, ведь у нас ничего не равно 0, а после как обнуляю флаги не меняются?
Возможно надо, что то добавить, чтобы после обнуления результатов флаги изменились?
0
murderer
3582 / 1465 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
13.12.2012, 13:58 #10
Инструкция cmp выполняет операцию sub, но не изменяет выходной регистр. 7-7=0, поэтому zf=1.
1
grice88
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 10
13.12.2012, 14:59  [ТС] #11
а как тогда изменить выходной регистр?

Добавлено через 46 минут
всё стало ясно, большое вас спасибо!
0
13.12.2012, 14:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 14:59

В приведенном коде добавляется один байт, при переполнении
program SumN; {$APPTYPE CONSOLE} uses SysUtils; label cycl, end_p;...

Что такое регистры микропроцессора? Перечислите регистры общего назначения
Помогите пожалуйста решить задания по TASM 1) Что такое регистры...

Объясните работу цикла в приведенном коде
Объясните пожалуйста следующий фрагмент for (int i = 1; i < txt.Length; i++)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru