2016-11-26 9 views
0

У меня есть код в сборке, который ведет себя немного странно. У меня есть функция C extern, которая вызывает с asm еще одну функцию из файла .asm. Эта функция C помещает в стек три адреса, используемые моей функцией из файла .asm. Все шло хорошо до тех пор пока это появилось:Два разных значения в одном адресе памяти - сборка

; Let's say we take from the stack first parameter from my C function. 
; This parameter is a string of bytes that respect this format: 
; - first 4 bytes are the sign representation of a big number 
; - second 4 bytes are the length representation of a big number 
; - following bytes are the actual big number 

section .data 
    operand1 dd 0 

section .text 
global main 

main: 
    push ebp 
    mov ebp, esp 
    mov eax, [ebp + 8] ; Here eax will contain the address where my big number begins. 
    lea eax, [eax + 8] ; Here eax will contain the address where 
        ; my actual big number begins. 
    mov [operand1], eax 

    PRINT_STRING "[eax] is: " 
    PRINT_HEX 1, [eax] ; a SASM macro which prints a byte as HEX 
    NEWLINE 

    PRINT_STRING "[operand1] is: " 
    PRINT_HEX 1, [operand1] 
    NEWLINE 

    leave 
    ret 

При выполнении этого кода, я получаю на терминале правильный выход для [EAX], и [operand1] он продолжает печать номер, который не изменится, если я могу изменить, что первый параметр моей функции C. Что я здесь делаю неправильно?

+1

Пожалуйста, ответьте на свой вопрос как ответ и отметьте его как правильно. Затем другие пользователи могут видеть, что вопрос решен. – alain

+0

* звонки с * asm * другая функция из файла .asm *: Что? Вам не нужно использовать inline-asm для вызова функции, определенной в файле '.asm'. Просто напишите прототип и назовите его нормально. –

ответ

0

Я сделал понятную ошибку. При выполнении:

mov [operand1], eax 
PRINT_STRING "[operand1] is: " 
PRINT_HEX 1, [operand1] 
NEWLINE 

Этот код выводит на первые байты содержимого (, который является адресом, где мое фактическим большое число начинается) содержится по адресу, где этот локальный переменные (operand1) проживает. Чтобы получить фактическое значение, которое находится в [operand1], я должен был сделать это:

mov ebx, [operand1] 
PRINT_STRING "[operand1] is: " 
PRINT_HEX 1, [ebx] 
NEWLINE