Iulian Barbu
Iulian Barbu

Reputation: 73

Two different values at the same memory address - assembly

I have some code in assembly which behaves a little bit strange. I have a C extern function that calls with asm another function from an .asm file. This C function puts on the stack three addresses used by my function from .asm file. All went well untill this appeared:

; 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 

When running this code, I get at the terminal the correct output for [eax], and for [operand1] it keeps printing a number which will not change if I modify that first parameter of my C function. What am I doing wrong here?

Upvotes: 2

Views: 270

Answers (1)

Michael Petch
Michael Petch

Reputation: 47573

I made an understandable mistake. When doing:

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

This code prints the first byte of the content (which is the address where my actual big number begins) contained at the address where this local variable (operand1) resides. In order to get the actual value which resides at [operand1] I had to do this:

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

Upvotes: 1

Related Questions