data starts at 00404000h bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ? 00404000h _ bVal 00404001 _ wVal 00404002 _ wVal 00404003 _ dVal 00404004 _ dVal 00404005 _ dVal 00404006 _ dVal 00404007 _ dVAl2 00404008 _ dVAl2 00404009 _ dVAl2 0040400A _ dVAl2 [mweeks@gsuad.gsu.edu@snowball ~]$ cat offset.asm ; Assemble: nasm -f elf64 offset.asm ; Link: gcc offset.o -o offset ; This is adapted for NASM. extern printf ; We will use this external function section .data ; Data section, initialized variables mystr: db "%x", 10, 0 ; String format to use (decimal), followed by NL bVal: db 0 wVal: dw 0 dVal: dd 0 dVal2: dd 0 section .text global main main: xor rax, rax ; A = 0 mov rsi,bVal mov rax, 0 mov rdi, mystr ; call printf mov rsi,wVal mov rax, 0 mov rdi, mystr ; call printf mov rsi,dVal mov rax, 0 mov rdi, mystr ; call printf mov rsi,dVal2 mov rax, 0 mov rdi, mystr ; call printf mov rax, 0 ret [mweeks@gsuad.gsu.edu@snowball ~]$ nasm -f elf64 offset.asm [mweeks@gsuad.gsu.edu@snowball ~]$ gcc offset.o -o offset [mweeks@gsuad.gsu.edu@snowball ~]$ ./offset 601038 601039 60103b 60103f [mweeks@gsuad.gsu.edu@snowball ~]$ unsigned int myDouble = 0x12345678; myDouble + 1 can access a byte instead of the whole 32 bits