Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了x86程序集,没有遵循小字节序(或者是吗?)(Linux)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我是汇编语言编程的新手,我编写了一个小程序来使用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 [
@H_197_6@
@H_197_6@
@H_607_15@
我是汇编语言编程的新手,我编写了一个小程序来使用sys_write系统@L_618_2@来打印整数.这是我的代码

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

这就是小字节序的古怪.

大佬总结

以上是大佬教程为你收集整理的x86程序集,没有遵循小字节序(或者是吗?)(Linux)全部内容,希望文章能够帮你解决x86程序集,没有遵循小字节序(或者是吗?)(Linux)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。