Странное поведение при использовании "lodsb" и "inc% si" - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь увеличить регистр %si на 1 в x86, однако у меня странное поведение. Примечание: я запускаю это в цикле.

Это увеличивает %si на два во время каждой итерации цикла:

loop:   inc %si
        lodsb
        jmp loop

И это увеличивает %si на единицу для каждой итерации:

         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 Ответ

4 голосов
/ 12 апреля 2019

Инструкция lods увеличивает si / esi / rsi на размер операнда. (Так, например, lodsb увеличивает si / esi / rsi на 1, а lodsw увеличивает si / esi / rsi на 2.)

Таким образом, в вашем цикле, использующем инструкцию lodsb, также не должно быть инструкции для увеличения si.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...