使用“ inc%si”时的奇怪行为

时间:2019-04-11 23:47:07

标签: assembly x86

我试图在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

1 个答案:

答案 0 :(得分:4)

lods指令将si / esi / rsi递增操作数大小。 (因此,例如,lodsb将si / esi / rsi递增1,而lodsw将si / esi / rsi递增2。)

因此,在使用lodsb指令的循环中,也不应存在递增si的指令。