assembly 在Linux上运行x86汇编程序的帮助

0pizxfdo  于 2022-12-23  发布在  Linux
关注(0)|答案(2)|浏览(226)

我目前正在学习一点Linux上的汇编语言,我需要你的建议。下面是这个小程序:

.section .data
  zahlen:
   .float 12,44,5,143,223,55,0

.section .text
.global _start

_start:
    movl $0, %edi
    movl zahlen (,%edi,4), %eax
    movl %eax, %ebx

 begin_loop:
   cmpl $0, %eax
   je prog_end
   incl %edi
   movl zahlen (,%edi,4), %eax
   cmpl %ebx, %eax
   jle begin_loop
   movl %eax, %ebx
   jmp begin_loop

prog_end:
   movl $1, %eax
   int $0x80

程序似乎编译和运行良好。但我有一些不清楚的问题/行为:
1.如果我使用命令“echo %?”检查返回值(寄存器%ebx中的较大值),它总是返回0。我期望值为223。知道为什么会发生这种情况吗?
1.我检查了DDD和gdb编译与调试选项。所以我看到程序运行正确的步骤。但如果我想检查寄存器与命令即“i r eax”它只显示我的地址,我相信,而不是值。同样的DDD。我只看到寄存器rax rbx等。在这里我需要一些建议,以获得正确的轨道。任何帮助感谢。谢谢

ippsafx7

ippsafx71#

主”寄存器eaxebxecxedx等都被设计为仅处理整数。float是一个简写术语,通常指非常特定的数据格式(即IEEE-754 binary 32标准),为此,您的CPU有专用的寄存器和硬件可供使用。你可以将它们原样加载到整数寄存器中,但是值不会像在高级动态类型语言中那样进行转换,而是加载了原始位模式,这可能根本不是你想要的。
这是因为汇编没有类型安全或运行时类型检查。CPU不知道你在程序中声明了什么类型的数据。所以当从内存加载到eax时,CPU假设数据是一个32位整数,即使你在源代码中声明了其他类型。
如果您对float的实际外观感到好奇,可以查看以下内容:Floating Point to Hex Calculator

q0qdq0h2

q0qdq0h22#

从float切换到long解决了这个问题。自己想错了。同样编译和链接为32位显示了调试器中正确的寄存器。

相关问题