san*_*216 4 linux x86 assembly endianness
我是汇编语言编程的新手,我编写了一个小程序,使用sys_write系统调用来打印整数.这是我的代码:
section .data
N: dw 216
chr: dw ,0,0,0,0x0a
section .bss
section .text
global _start
_start:
xor ax, ax
mov ax, word [N]
mov cx, 10
mov ebx,4
shift_while: div cx
add dx, 0x0030
mov word [chr+ebx],dx
sub ebx, 2
xor dx, dx
cmp ax, 0
jne shift_while
call printchar
exit: mov eax, 1
mov ebx, 0
int 80h
printchar: pushad
mov eax, 4
mov ebx, 1
mov ecx, chr
mov edx, 8
int 80h
popad
ret
Run Code Online (Sandbox Code Playgroud)
我有硬编码216,要打印的数字,我得到正确的输出.然而,我所困惑的是"mov word [chr + ebx],dx"指令.dx在第一次迭代中包含0x0032,因此在地址[chr + ebx]处,此值应存储为32 00(十六进制).但是当我使用gdb检查chr内存时,它显示:
(gdb) x /5hx 0x80490d2
0x80490d2 <chr>: 0x0032 0x0031 0x0036 0x000a
Run Code Online (Sandbox Code Playgroud)
我所期待的是0x3200 0x3100 0x3600 x0a00并认为我必须做进一步的内存操作才能得到正确的结果.我在这个地方出错了吗?有什么东西我似乎无法看到.我真的很感激这里的一点帮助.这是我在stackoverflow上的第一篇文章.
它只是一种代表性的东西 - 从字节方面来看,你在内存中拥有的是什么
32 00 31 00 26 00 0a 00
Run Code Online (Sandbox Code Playgroud)
但当你将其视为16位值时
0032 0031 0026 000a
Run Code Online (Sandbox Code Playgroud)
同样,如果您将其视为32位值,它将是:
00310032 000a0026
Run Code Online (Sandbox Code Playgroud)
这就是小字节序的古怪.;-)