组装说明MOV BL,0

时间:2019-01-13 15:03:35

标签: assembly x86-16

我对汇编指令有疑问。我不明白为什么在本练习中,指令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 :(得分:0)

它使用无符号比较,0是可能的最低无符号数。用max=0max=INT_MIN开始一个最大查找循环是正常的,而不是加载第一个元素,因为这样可以简化处理输入为零长度的情况。

如果两个数组都包含全零,这似乎是一个错误:它永远不会将AL设置为0或1来记录哪个数组具有最大值。但是可能只是在AL上分支才能确定要打印的字符串,因此您可以根据AL中的起始内容来随机获得一个字符串。

执行mov al, '1'mov al, '2'并在搜索后将AL存储到字符串中的相关位置会更有效率,但是您需要确保已将其初始化以防搜索循环在0以上找不到新的最大候选值。