加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

x86程序集,没有遵循小字节序(或者是吗?)(Linux)

发布时间:2020-12-14 01:29:39 所属栏目:Linux 来源:网络整理
导读:我是汇编语言编程的新手,我编写了一个小程序来使用sys_write系统调用来打印整数.这是我的代码: section .dataN: dw 216chr: dw,0x0asection .bsssection .text global _start_start: xor ax,ax mov ax,word [N] mov cx,10 mov ebx,4shift_while: div cx add
我是汇编语言编程的新手,我编写了一个小程序来使用sys_write系统调用来打印整数.这是我的代码:

section .data

N: dw 216
chr: dw,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

我有硬编码216,要打印的数字,我得到正确的输出.然而,我所困惑的是“mov word [chr ebx],dx”指令. dx在第一次迭代中包含0x0032,因此在地址[chr ebx]中,该值应存储为
32 00(十六进制).但是当我使用gdb检查chr内存时,它显示:

(gdb) x /5hx 0x80490d2
0x80490d2 <chr>:    0x0032  0x0031  0x0036  0x000a

我所期待的是0x3200 0x3100 0x3600 x0a00并认为我必须做进一步的内存操作才能得到正确的结果.
???????我在这个地方出错了吗?有什么东西我似乎无法看到.我真的很感激这里的一点帮助.这是我在stackoverflow上的第一篇文章.

解决方法

它只是一种代表性的东西 – 从字节方面来看,你在内存中拥有的是什么

32 00 31 00 26 00 0a 00

但当你将其视为16位值时

0032 0031 0026 000a

同样,如果您将其视为32位值,它将是:

00310032 000a0026

这就是小字节序的古怪.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读