Консультация № 185698
29.03.2012, 12:15
76.63 руб.
0 18 1
Здравствуйте, уважаемые эксперты! Прошу вас написать программу вот с таким заданием:

Дано 32-битное слово, определить длину самой длинной серии состоящей из одних нулей.

Я так понимаю что мы вводим какое либо число, а программа сама представляет в виде 32-битах, т.е. допустим мы записываем в переменную 120, это получается 1111000, а остальное по идее должна заполнять нулями.
В ответе в регистре должно быть количество самой длинной серии из нулей. Желательно, чтобы к КАЖДОЙ строчке были комментарии.

п.с.
Ассемблер : TASM
Размер переменных: слово

Заранее спасибо.

Обсуждение

давно
Посетитель
7438
7205
29.03.2012, 12:27
общий
1) Число вводим или задаем в теле программы?
2) 32-битные регистры используем?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 12:32
общий
Адресаты:
1. Ну число по идее надо задавать в программе через переменную, если что, то файлик asm открывать через блокнот и вписывать другое число.
2. Да, используем.
Неизвестный
29.03.2012, 12:36
общий
Адресаты:
Так же надо чтобы она считала и отрицательные числа.
давно
Посетитель
7438
7205
29.03.2012, 12:47
общий
А какая разница? Отрицательные числа просто будут в дополнительном коде...
Будем считать те же нули. Основное отличие в том, что для положительных старшие биты будут заполняться нулями,
а для отрицательных - единицами.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 13:08
общий
Адресаты:
Ну да, вы правы
давно
Посетитель
7438
7205
29.03.2012, 13:12
общий
это ответ
Здравствуйте, Yankov Dmitry!
Вот Вам программа, подсчитывающая максимальное количество нулей
Программа для заданного числа дает ответ 7
Если что непонятно, спрашивайте. Растолкую. Если надо - подправим.

[code h=200]
.model small
.data
num dd 1234567890 ;наше число 499602D2H = 0100 1001 1001 0110 0000 0010 1101 0010b

.code
.386
start:
mov ax, @data
mov ds, ax

mov eax, num ;грузим число в регистр eax
call zeros ;считаем длину самой длинной последовательности нулей

mov ax, 4c00h
int 21h

;подсчет самой длинной последовательности нулей
;на входе - число в eax
;результат - в регистре eax
zeros proc
xor dx, dx ;dh - текущая длина, dl - максимальная
mov cx, 32 ;счетчик бит
zeros_loop: ;цикл по битам
shr eax, 1 ;выдвигаем младший бит в С
jnc zero_found ;0?
call CmpZeroGroup ;если единица, то проверяем, что мы имеем
jmp next ;на продолжение
zero_found: ;0!
inc dh ;считаем
next: ;на следуюий бит
loop zeros_loop ;по всем
call CmpZeroGroup ;проверим последнюю последовательность
mov al, dl ;длина максимальной последовательности нулей,
;старшие биты обнулены в результате сдвига
ret
zeros endp

;проверка группы нулевых бит
CmpZeroGroup proc
cmp dh, 0 ;есть, что проверять?
je CZG_ret ;нулей не было - на выход
cmp dh, dl ;что-то есть, сравним с максимальным
jbe CZG_clear ;меньше или равно - на обнуление текущего счетчика
mov dl, dh ;больше! - сохраним новый максимальный
CZG_clear:
mov dh, 0 ;обнулим счетчик для подсчета новой последовательности
CZG_ret:
ret
CmpZeroGroup endp

end start
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 13:13
общий
Адресаты:
Получается что размер переменных это двойное слово, т.к. как 32 бита.. ошибся, простите.
давно
Посетитель
7438
7205
29.03.2012, 13:16
общий
Я так и понял
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 13:22
общий
Адресаты:
Сейчас я соберусь с мыслями и спрошу, что непонятно
Неизвестный
29.03.2012, 13:31
общий
Адресаты:
Я так понимаю результат записывается в EAX, а что тога записывается в EBX, ECX, EDX?
loop zeros_loop ;по всем - это значит проходим по всем битам?!
Неизвестный
29.03.2012, 13:39
общий
Адресаты:
Если мы допустим вводим вот такое число 12345678901234567890 - 1010101101010100101010011000110011101011000111110000100000000000


То как программа должна среагировать на это?!
давно
Посетитель
7438
7205
29.03.2012, 13:41
общий
29.03.2012, 13:52
1) А не важноГлавное, что результат в eax
Хотя будет следующее:
ebx не используется вообще
ecx = 0 (точнее cx = 0, о старшем слове в общем случае ничего сказать нельзя, мы его не трогали) после завершения цикла
edx = eax (точнее dx = ax, т.к. опять же мы использовали только младшее слово)

2) ну да, по всем битам. Счетчик бит в cx командой loop уменьшается на 1 и если не нуль, то делается переход на метку
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
29.03.2012, 13:44
общий
Вы задали не двойное слово, а четвертное. :)
программа будет работать только с младшим двойным словом. А Вы чего ожидали?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 13:45
общий
Адресаты:
аа, точно. все понял. спасибо огромное за работу.
давно
Посетитель
7438
7205
29.03.2012, 13:47
общий
Кстати, Вы ошиблись. В конце числа должно быть:
0AD2h = 0000101011010010b
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 13:52
общий
Адресаты:
Не понял, откуда это взялось?!
давно
Посетитель
7438
7205
29.03.2012, 13:57
общий
Вы задали вопрос о числе
12345678901234567890 - 1010101101010100101010011000110011101011000111110000100000000000
На самом деле:
12345678901234567890 = AB54A98CEB1F0AD2h = 1010101101010100101010011000110011101011000111110000101011010010b
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.03.2012, 14:06
общий
Адресаты:
Ну так то да,
12345678901234567890 - 10-ая =
AB54A98CEB1F0AD2h - 16-ная = 1010101101010100101010011000110011101011000111110000101011010010b - 2-ная
Форма ответа