Инструкция по сборке MOV BL, 0 - PullRequest
0 голосов
/ 13 января 2019

У меня проблема с инструкцией по сборке. Я не понимаю, почему в этом упражнении инструкция MOV BL, 0 уже содержит фактический максимум. После кода:

    SECTION data
    Vect1: db 13,15,22,7,5,3,21,2,0,10
    Vect2: db 1,7,3,2,22,21,3,28,7,11
    string1: db ‘ maximum is in the vector 1’,0
    string2: db ‘maximum is in the vector 2’,0
    SECTION text
    ..start:
    ...
    FindMax:
    push bp
    mov bp, sp
    mov si,[bp+6] ; Vect1
    mov di,[bp+4] ; Vect2
    mov bl,0 ; bl conteins the actual maximum ->>>WHY??
    mov cx,[bp+8] ; N = 10

    Loop:
mov ah,[si]
cmp ah, bl
ja NewMaximum1

LoopRef1:
inc si
mov ah,[di]
cmp ah,bl
ja NewMaximum2

LoopRef2:
inc di
loop Loop
jmp endFunc

NewMaximum1:
mov bl,ah
mov al, 0
jmp LoopRef1

NewMaximum2:
mov bl,ah
mov al, 1
jmp LoopRef2
endFunc:
pop bp
ret

Заранее спасибо за ответ!

1 Ответ

0 голосов
/ 13 января 2019

Используются сравнения без знака, а 0 - минимально возможное число без знака. Обычно цикл поиска максимального значения начинается с max=0 или max=INT_MIN вместо загрузки первого элемента, поскольку это упрощает обработку случая, когда вход имеет нулевую длину.

Похоже, есть ошибка, если оба массива содержат все нули: он никогда не установит AL в 0 или 1, чтобы записать, какой массив имеет максимум. Но, вероятно, это просто ответвление на AL, чтобы решить, какую строку печатать, поэтому вы получаете случайную в зависимости от того, с чего начинали в AL.

Было бы намного эффективнее сделать mov al, '1' или mov al, '2' и сохранить AL в соответствующей позиции в строке после поиска, но тогда вам нужно будет убедиться, что он был инициализирован в случае поиска Цикл никогда не находил нового максимального кандидата выше 0.

...