将数字移动到具有不同大小的内存

时间:2018-02-20 22:10:27

标签: assembly memory x86 move cpu-registers

我正在学习大会,我找到了一些我不明白的东西。

如果我有这样的代码

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

如果我尝试将更大的数字放入内存而不是保留(让256var_b resb 1进入for (i = 0; i < 11; i++) { //i = 0 > starting index //i < 11 > ending index //i++ > index increment } ),它是如何工作的?

谢谢。

1 个答案:

答案 0 :(得分:3)

您的代码将0x12345678存储在edx中,然后将edx中的值复制到var所在的位置。 最低字节(8位)在寄存器中存储在存储器中时首先出现,因为x86 processorslittle 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

https://github.com/tigertv/stackoverflow-answers