我正在学习大会,我找到了一些我不明白的东西。
如果我有这样的代码
section .data
var dw 0x10, 0x20, 0x30
section .text
; ...
mov edx, dword 0x12345678
mov [var], edx
; ...
我知道,结果将是
[var] = 0x5678
[var + 2] = 0x1234
我只是不知道里面发生了什么。
为什么dx = 0x5678
存储为第一个元素而不是第二个元素?在存储了这一半后,edx
的前半部分突然变为word
而不是double word
?
如果我尝试将更大的数字放入内存而不是保留(让256
说var_b resb 1
进入for (i = 0; i < 11; i++) {
//i = 0 > starting index
//i < 11 > ending index
//i++ > index increment
}
),它是如何工作的?
谢谢。
答案 0 :(得分:3)
您的代码将0x12345678
存储在edx
中,然后将edx
中的值复制到var
所在的位置。
最低字节(8位)在寄存器中存储在存储器中时首先出现,因为x86 processors为little endian。
由nasm
编译的代码:
global _start
section .data
var dw 0x10, 0x20, 0x30
section .text
_start:
mov edx, dword 0x12345678
mov [var], edx
; quit the program
mov eax, 1 ; sys_exit system call
push dword 0 ; program return value
push eax
int 0x80 ; call the kernel
调试器:
(gdb) b _start
Breakpoint 1 at 0x8048080
(gdb) r
Starting program: /home/ssssssssssssssss/test
Breakpoint 1, 0x08048080 in _start ()
(gdb) disassemble
Dump of assembler code for function _start:
=> 0x08048080 <+0>: mov edx,0x12345678
0x08048085 <+5>: mov DWORD PTR ds:0x804908c,edx
End of assembler dump.
(gdb) x/4x 0x804908c
0x804908c: 0x10 0x0 0x20 0x0
(gdb) si
0x08048085 in _start ()
(gdb) disassemble
Dump of assembler code for function _start:
0x08048080 <+0>: mov edx,0x12345678
=> 0x08048085 <+5>: mov DWORD PTR ds:0x804908c,edx
End of assembler dump.
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x12345678 305419896
ebx 0x0 0
esp 0xbfffee70 0xbfffee70
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048085 0x8048085 <_start+5>
eflags 0x202 [ IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) si
0x0804808b in ?? ()
(gdb) x/4x 0x804908c
0x804908c: 0x78 0x56 0x34 0x12
(gdb)
objdump的:
test: file format elf32-i386
Disassembly of section .text:
08048080 <_start>:
8048080: ba 78 56 34 12 mov edx,0x12345678
8048085: 89 15 8c 90 04 08 mov DWORD PTR ds:0x804908c,edx