Консультация № 175937
08.01.2010, 23:01
0.00 руб.
0 6 3
Здравствуйте, уважаемые эксперты! С прошедшими праздниками вас! Помогите пожалуйста решить следующую задачу:
В слове установить крайний справа нулевой бит: например, двоичное число ...01010111 преобразуется в ...01011111, а число ...00001111 — в число ...00011111.
Нельзя использовать арифметические операции.
Программу надо написать на ассемблере для процессоров 80286 и 80586 версий (аналоги - программа DEBUG и TASM)

Обсуждение

Неизвестный
09.01.2010, 11:15
общий
это ответ
Здравствуйте, Даниил Цветков.
Код:
model tiny
.data
bits dw 0FFh
.code
org 100h
start:
mov ax,bits ; исходное слово
mov dx,1 ; для проверки битов
@next:
test ax,dx ; проверка бита
jz @set_bit ; если 0, то установить
shl dx,1
jnz @next
jmp @exit
@set_bit:
or ax,dx ; установить бит
@exit:
retn
end start
5
давно
Посетитель
7438
7205
10.01.2010, 01:35
общий
это ответ
Здравствуйте, Даниил Цветков.
Альтернативный вариант для 386+
Используем команду bsf, которая возвращает в первом операнде
номер первого ненулевого бита второго операнда в памяти.

Еще один вариант с использованием для установки бита команды bts
Код:
	.model	tiny, C
.386
.code
.startup
call SetBit,0f7fh
call SetBit,0ffffh
.exit 0

SetBit proc w:word
not w ;будем искать первую 1 (вместо 0)
bsf cx, w ;в CX будет номер первой 1
; или не поменяется (для 0ffffh,
; для которого можно устанавливать любой бит)!!!
not w ;вернем в исходное состояние
mov ax, w ;исходное слово
bts ax, cx ;установим найденный бит
ret
SetBit endp

end

Удачи!

Приложение:
.model tiny, C
.386
.code
.startup
call SetBit,0f7fh
call SetBit,0ffffh
.exit 0

SetBit proc w:word
mov cx, 16 ;в случае ненахождения нулей, т.е. 0ffffh (при этом, кстати, будет ZF = 1)
; cx не поменяется, а тогда при получении маски бита
; получим 0 и получим исходное число без изменений
not w ;будем искать первую 1 (вместо 0)
bsf cx, w ;в CX будет номер первой 1 !!!
not w ;вернем в исходное состояние
mov ax, 1 ;получим маску
shl ax, cl
or ax, w ;и установим бит в 1 !!! (или не установим для 0ffffh)
ret
SetBit endp

end
5
спасибо большое
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
11.01.2010, 14:05
общий
это ответ
Здравствуйте, Даниил Цветков.

Предлагаю ещё один вариант для х86.
Удачи!

Приложение:
model tiny
;.186
.code
org 100h
;первое число
begin: mov ax,57h
call show
call change
call show
;второе число
mov ax,0fh
call show
call change
call show
;выход
xor ax,ax
int 16h
ret
;готовимся к выводу бита
show:
push ax
mov cx,16
mov bx,ax
;выводим бит
showBit:
mov al,'0'
shl bx,1
adc al,0
int 29h
loop showbit
mov al,13
int 29h
mov al,10
int 29h
pop ax
ret
;изменяем бит
Change: xor cx,cx
SR:
inc cx
rcr ax,1
jc SR
stc
rcl ax,cl
ret
end begin
5
спасибо, оригинальное решение
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
13.01.2010, 02:54
общий
A... Можно всё-таки написать для DEBUG? Потому как не особо хорошо понимаю ассемблер и не могу сообразить, как решать, имея ограничение - использовать команды процессора ниже 386 версии. Спасибо заранее.
давно
Посетитель
7438
7205
13.01.2010, 12:10
общий
Сначала вводите команду a
Потом вводите программу (например, вариант Константина Николаевича)
Код:
mov ax,57
xor cx,cx
inc cx
rcr ax,1
jc 105
stc
rcl ax,cl
int3
Надеюсь, Вы знаете, как пользоваться DEBUG-ом?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
13.01.2010, 12:32
общий
Даниил Цветков:
Компилируете программу TASMом.
После этого в командной строке набираете:

После команды t на экране текущее значение регистров и следующая выполняемая команда.
Помощь вызывается с помощью знака вопроса.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа