ESI и EDI меняют значения после вызова функции - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь преобразовать некоторые строки, представляющие двоичные числа, в их действительные значения, используя функцию преобразования, определенную в другом файле.

Вот мой код:

main.asm

bits 32

global start        

%include 'convert.asm'

extern exit, scanf, printf
import exit msvcrt.dll   
import scanf msvcrt.dll
import printf msvcrt.dll

section data use32 class=data
    s DB '10100111b', '01100011b', '110b', '101011b'
    len EQU $ - s
    res times len DB 0

segment code use32 class=code
    start:
        mov     ESI, s ; move source string 
        mov     EDI, res ; move destination string
        mov     ECX, len ; length of the string
        mov     EBX, 0

        repeat:
            lodsb ; load current byte into AL
            inc     BL
            cmp     AL, 'b' ; check if its equal to the character b
            jne     end ; if its not, we need to keep parsing
            push    dword ESI ; push the position of the current character in the source string to the stack
            push    dword EDI ; push the position of the current character in the destination string to the stack
            push    dword EBX ; push the current length to the stack
            call    func1 ; call the function
            end:
        loop     repeat

        push    dword 0  
        call    [exit]      

convert.asm

func1:
    mov     ECX, [ESP] ; first parameter is the current parsed length
    mov     EDI, [ESP + 4] ; then EDI
    mov     ESI, [ESP + 8] ; and ESI
    sub     ESI, ECX

    parse:
        mov     EDX, [ESI]
        sub     EDX, '0'
        mov     [EDI], EDX
        shl     dword [EDI], 1
        inc     ESI
    loop    parse

    ret     4 * 3

Я заметил, что после вызова функции продолжаю появляться ошибки нарушения доступа.ESI имеет некоторое случайное значение после вызова.Я делаю что-то неправильно?Я думаю, что часть с параметром должна быть в порядке.Внутри функции преобразования, параметры должны быть доступны в обратном порядке.Но по какой-то причине этого не происходит.

Я также вполне уверен, что я правильно выполнил компиляцию / компоновку, используя nasm и alink.

nasm -fobj main.asm

nasm -fobj convert.asm

alink main.obj convert.obj -oPE -subsys console -entry start

...