2012-03-28 203 views
1

我在这里的新功能与我在装配中的新功能相同。我希望你能帮助我开始。 我使用32位(i686)Ubuntu在程序集中使用gcc编译器。对32位系统中的64位字进行操作

我知道通用寄存器最大为32位(4字节),但是当我必须对64位数进行操作时呢?英特尔的说明表示,高位存储在%edx中,并且低于%eax 好... 那么,如何使用这个2寄存器号码做些什么呢?我必须将64位十进制转换为十六进制,然后将其保存到内存并显示在屏幕上。

如何在.data段的程序开始时制作64bit quadword?

编辑: 当我在C中定义的全局变量LLU(很长很长的无符号),并编译成汇编它使:

.data 
a: 
.long <low bits> 
.long <high bits> 

这是因为参数保存在栈中向后或更多的东西?

+1

将十进制转换为二进制?不知何故,你在寄存器中有十进制数字? – 2012-03-28 23:32:47

+0

gosh,thx ...我不得不将dec转换为hex,需要编辑帖子。完全去dec - >(U2 - 二进制补码) - >十六进制,但是我想从容易开始。 – Vilo 2012-03-28 23:41:41

+0

我相信'edx:eax'只适用于'idiv'和'imul',不适用于一般用途的64位数学。 – 2012-03-29 04:17:05

回答

3
  1. 编写使用long long号码(其具有在Linux/IX86 64位)一个简单的C程序。
  2. gcc -S t.c将该程序编译为程序集。
  3. 研究由此产生的程序集。
  4. 修改你的程序做一些更复杂,并重复步骤2和3。

反复几次后,你应该有你需要的组件做什么好手柄。

+0

伟大的解决方案!当我上学时必须检查它。 – Vilo 2012-03-29 07:57:07

0

当我在C中定义的全局变量LLU(很长很长的无符号),并编译成汇编它使:

.data 
a: 
.long <low bits> 
.long <high bits> 

这是因为参数保存在栈中向后或更多的东西?

+0

请编辑原来的问题..这个答案似乎有问题里面.. – Jayan 2012-03-30 09:23:27

相关问题