Консультация № 176151
20.01.2010, 00:01
0.00 руб.
0 3 1
Здравствуйте, помогите разобраться с задачей.
Условие:
В векторе B(10) заменить все единицы нулями

Правильное ли это решение (tasm):

Код:
stacks segment word stack 
db 100H dup(0)
stacks ends

data segment para public 'data'
array_size equ 10
array_source dw -3, -2, 1, -1, 4, 3, 0, 1, 3, 1
data ends

code SEGMENT para public 'code'
;; initialisation of segments...
assume CS: code,DS: data,SS: stacks
start:
mov AX, data
mov DS, AX

mov cx, array_size
mov si, offset array_source
mov ax, 1
xor bx, bx
start_scan:
cmp ax, [si]
jne inc_si
mov [si], bx
jmp start_scan
inc_si:
add si, 2
loop start_scan


MOV AX,4C00H ; завершение программы
INT 21H
code ENDS

end start


Если можно разъясните как это все работает?

Обсуждение

Неизвестный
20.01.2010, 01:04
общий
решение верно
давно
Старший Модератор
31795
6196
20.01.2010, 10:29
общий
Эту строчку убрать
jmp start_scan
inc_si:

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

А так всё нормально.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
24.01.2010, 05:00
общий
это ответ
Здравствуйте, pembrock.
Вам в мини-форуме уже объяснили, что Ваш код вполне рабочий
Для понимания "как это все работает" я прокомментировал Вашу программу.
Удачи!

Приложение:
stacks segment word stack
db 100H dup(0)
stacks ends

data segment para public 'data'
array_size equ 10
array_source dw -3, -2, 1, -1, 4, 3, 0, 1, 3, 1
data ends

code SEGMENT para public 'code'
;; initialisation of segments...
assume CS: code,DS: data,SS: stacks
start: ;точка входа
mov AX, data ;у нас, фактически, модель памяти SMALL (для формата EXE),
mov DS, AX ; поэтому необходимо проиницировать сегмент данных

mov cx, array_size ;количество элементов массива
mov si, offset array_source ;адрес массива
mov ax, 1 ;то, что будем искать
xor bx, bx ;то, на что поменяем
start_scan: ;цикл по всем элементам массива
cmp ax, [si] ;сравним очередной элемент массива [si] с 1
jne inc_si ;если не равно, то обходим
mov [si], bx ;есл равно 1, то меняем на 0
; jmp start_scan ;лишняя строка (работает и с ней!, просто лишняя работа)
inc_si: ;увеличим адрес
add si, 2 ;на следующее слово
loop start_scan ;cx=cx-1, на следующий элемент пока cx не 0


MOV AX,4C00H ; завершение программы
INT 21H
code ENDS

end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа