Assembly 为什么需要这条装配线

Assembly 为什么需要这条装配线,assembly,bootloader,Assembly,Bootloader,我找到了编写引导加载程序的教程。除了一行,我都很清楚。下面是一些代码 Print: lodsb or al, al ;I don't get this line jz PrintDone mov ah, 0x0e int 0x10 jmp Print 它还有一些其他代码清除int 0x10使用的寄存器。我唯一不明白的是or al,al线。如果你自己或者其他什么东西,你会得到你开始的东西,对吗 如果有人能回答这个问题,我会永远爱他们:)JZ指令是J

我找到了编写引导加载程序的教程。除了一行,我都很清楚。下面是一些代码

Print:
    lodsb
    or al, al ;I don't get this line
    jz PrintDone
    mov ah, 0x0e
    int 0x10
    jmp Print
它还有一些其他代码清除int 0x10使用的寄存器。我唯一不明白的是or al,al线。如果你自己或者其他什么东西,你会得到你开始的东西,对吗


如果有人能回答这个问题,我会永远爱他们:)

JZ指令是JMP指令的一种形式,只是只有设置了零标志时才会发生跳转。如果AL为零,“OR AL,AL”设置零标志。这比使用CMP比较更有效

CMP AX,0        ;see if the number in ax is zero (zero flag set if so)
OR AX,AX        ;this does exactly the same but uses 2 bytes instead of 3
TEST AX,AX      ;again this is the same and uses only 2 bytes

JZ指令是JMP指令的一种形式,只是跳转仅在设置了零标志时发生。如果AL为零,“OR AL,AL”设置零标志。这比使用CMP比较更有效

CMP AX,0        ;see if the number in ax is zero (zero flag set if so)
OR AX,AX        ;this does exactly the same but uses 2 bytes instead of 3
TEST AX,AX      ;again this is the same and uses only 2 bytes

“or”可能用于确保在al为零时设置z标志。它在不修改al的情况下设置z标志。Lodsb会将一个值加载到al,但不会影响零标志,因此需要另一条指令来进行此操作。如果al为零,则可能会出现“or”以确保设置z标志。它在不修改al的情况下设置z标志。Lodsb将一个值加载到al,但不影响零标志,因此需要另一条指令来执行该操作。
或al,al
的效率实际上低于
cmp al,0
:两者都是2字节,因为cmp采用了特殊的
al,imm8
编码,但
cmp
更好。而
test
/
cmp
可以与
jcc
进行宏融合,并且不向寄存器添加延迟。
或al,al
的效率实际上低于
cmp al,0
:两者都是2字节,因为cmp的特殊
al,imm8
编码,但
cmp
更好。而
test
/
cmp
可以与
jcc
进行宏融合,并且不会给寄存器增加延迟。