【问题标题】:Assembly instruction MOV BL,0汇编指令 MOV BL,0
【发布时间】:2019-01-13 15:03:35
【问题描述】:

我对汇编指令有疑问。我不明白为什么在这个练习中指令 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

提前感谢您的回答!

【问题讨论】:

  • 在函数开始时,尚未检查任何元素,因此没有最大值。你留下了不相关的代码,删除了相关的代码!
  • 是的,我现在发布它。
  • 请注意,在 FindMax 过程中,有一个名为“新最大值”的标签。
  • 这是另一部分

标签: assembly x86-16


【解决方案1】:

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

如果两个数组都包含全零,看起来会有一个错误:它永远不会将 AL 设置为 0 或 1 来记录哪个数组具有最大值。但可能它只是在 AL 上分支来决定打印哪个字符串,所以你会得到一个随机字符串,这取决于 AL 中的内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2012-04-08
    • 1970-01-01
    • 2013-02-06
    • 2017-04-09
    相关资源
    最近更新 更多