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
进行宏融合,并且不会给寄存器增加延迟。