我试图在x86中将%si
寄存器增加1,但是我有一些奇怪的行为。注意:我正在循环运行它。
这在每次循环迭代期间将%si
增加2:
loop: inc %si
lodsb
jmp loop
每次迭代,%si
都会增加1:
mov %si, %cx
loop: lodsb
inc %cx
mov %cx, %si
jmp loop
我的假设正确吗?这是正确的方法吗?
这是使用有效的BIOS中断的示例:
bios_write:
push %bp
mov %sp, %bp
pusha
mov 4(%bp), %cx
0: mov %cx, %si
lodsb
cmp $0, %al
je 1f
push %ax
call bios_putchar
pop %ax
inc %cx
jmp 0b
1: popa
mov %bp, %sp
pop %bp
ret
这是一个没有的示例
bios_write:
push %bp
mov %sp, %bp
pusha
mov 4(%bp), %si
0: lodsb
cmp $0, %al
je 1f
push %ax
call bios_putchar
pop %ax
inc %si
jmp 0b
1: popa
mov %bp, %sp
pop %bp
ret
答案 0 :(得分:4)
lods
指令将si / esi / rsi递增操作数大小。 (因此,例如,lodsb
将si / esi / rsi递增1,而lodsw
将si / esi / rsi递增2。)
因此,在使用lodsb
指令的循环中,也不应存在递增si
的指令。