了解GNU Assembly中的内存分配和数据检索

时间:2017-07-23 14:04:20

标签: assembly endianness

.data
        x:      .int 1145258561
.bss
        .lcomm temp, 4
.text
        .globl _start
        _start:
                movl $4, %eax
                movl $1, %ebx
                movl x, %ecx
                movl $1, %edx
                int $0x80

                movl $1, %eax
                movl $0, %ebx
                int $0x80

我正在研究一个小端机器,并试图在我尝试打印时理解4字节整数的哪个内存字节将被打印到屏幕上。整数x的值1145258561是一个特殊值,因为它的十六进制转换是0x44434241。这意味着该整数的4个连续字节分别包含0x44,0x43,0x42和0x41(或者分别只是ASCII字母D,C,B和A.

由于我在一台小端机器上运行,正如我前面提到的,这些ASCII字母将以相反的顺序存储。可以说整数x的内存地址是0x600000。所以A,B,C,D应存储在存储单元0x600000,0x600001,0x600002和0x600003上。

在打印1个字节(edx = 1)时,它要么取整数的第一个或最后一个字节,所以要打印A或D,但令人惊讶的是屏幕上没有输出。所以现在我有3个问题:

  1. 为什么屏幕上没有任何输出?
  2. 在这种情况下,会选择哪个内存位置0x600000或0x600003进行打印?
  3. 如果我尝试打印4个字节,即将edx更改为4,那么输出应该是什么? (我尝试过,但屏幕上仍然没有输出。)

0 个答案:

没有答案