我目前正在学习一点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等。在这里我需要一些建议,以获得正确的轨道。任何帮助感谢。谢谢
2条答案
按热度按时间ippsafx71#
主”寄存器
eax
、ebx
、ecx
、edx
等都被设计为仅处理整数。float是一个简写术语,通常指非常特定的数据格式(即IEEE-754 binary 32标准),为此,您的CPU有专用的寄存器和硬件可供使用。你可以将它们原样加载到整数寄存器中,但是值不会像在高级动态类型语言中那样进行转换,而是加载了原始位模式,这可能根本不是你想要的。这是因为汇编没有类型安全或运行时类型检查。CPU不知道你在程序中声明了什么类型的数据。所以当从内存加载到
eax
时,CPU假设数据是一个32位整数,即使你在源代码中声明了其他类型。如果您对
float
的实际外观感到好奇,可以查看以下内容:Floating Point to Hex Calculatorq0qdq0h22#
从float切换到long解决了这个问题。自己想错了。同样编译和链接为32位显示了调试器中正确的寄存器。