汇编:使用两个32位寄存器中的值进行除法,就好像它们是一个64位整数一样

抗开心果

我有一个64位整数需要在汇编中打印,但是我正在32位计算机上工作,因此我将64位整数存储在两个32位寄存器中。整数的高位部分存储在%edx中,低位部分存储在%eax中。

我知道如何打印32位整数没有问题,只需将其连续除以10并打印余数即可。

我也知道如何将我的64位数字乘以32位。

但是杀死我的是分裂:

从我收集的数据来看,我想我必须将每个寄存器%edx和%eax除以十,然后以某种方式将两个答案组合在一起,就像我要乘乘法一样,但是如何处理每个除法的余数和商?

我正在32位Linux机器上使用AT&T x86语法使用GNU汇编器。谢谢

rcgldr

这个问题最近出现了好几次。该算法类似于用铅笔和纸进行除法,将多位数的除数除以一位数的除数。这是一个代码段,edi:esi中保留了64位股息。注意,可以扩展此方法,以将存储在内存中的非常大的除数除以32位除数。

        .data
decstr  db      24 dup (0)
pfstr   db      '%','s',0dh,0ah,0
        .code
        extrn   _printf:NEAR
_main   proc    near
        mov     edi,000000002h          ;edi = high order dvnd
        mov     esi,04CB016EAh          ;esi = low  order dvnd
        lea     ebx,decstr+23           ;ebx = ptr to end string
        mov     ecx,10                  ;ecx = 10 (constant)
div0:   xor     edx,edx                 ;clear edx
        mov     eax,edi                 ;divide high order
        div     ecx
        mov     edi,eax
        mov     eax,esi                 ;divide low order
        div     ecx
        mov     esi,eax
        add     dl,'0'                  ;store ascii digit
        dec     ebx
        mov     [ebx],dl
        mov     eax,edi                 ;repeat till dvnd == 0
        or      eax,esi
        jnz     div0
        push    ebx                     ;display string
        push    offset pfstr
        call    _printf
        add     sp,8
        xor     eax,eax
        ret
_main   endp

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用group by子句的SQL查询,但是对两个不同的值进行计数,就好像它们是相同的一样

加载多个JS文件,就好像它们是一个文件一样?

AVR 汇编:将一个 16 位数字加载到两个 8 位寄存器中

并排显示两个框,就好像它们是一个

为什么我可以按位或两个字符串,就好像它们是二进制数一样?

生成一个随机的32位数字以存储在64位寄存器中

遍历有序字典,就好像它是一个列表一样

在Forth中执行字符或字符串,就好像它是一个单词一样

如果我有一个8位值,那么使用8位寄存器代替16、32或64位有什么好处?

我如何才能使用一个主题来对所有材料用户界面输入进行样式设置,就好像它们具有variant =“概述”一样?

我如何将一个月的 DTO 分成两部分,就好像它是一个单独的月份一样?

按名称对文件进行排序,就好像它们是日期一样

合并两个数组,就好像在洗牌时不进行迭代一样?

用两个32位整数“模拟”一个64位整数

如何打印列表项,就好像它们是 python 中的打印内容一样?

对整数列表进行排序,就好像它是Java中的字符串列表一样

GNU Parallel:重定向管道标准输入,就好像它是一个文件一样

写入有符号整数,就好像它在C ++中是无符号的一样

从四个 16 位 1 构造一个 64 位掩码寄存器

如何判断一个寄存器中的 ascii 字符是否等于 64 位 ARM 汇编中另一个寄存器中的 ascii 字符

两个 16 位整数到一个 32 位浮点值

将一个字节递增一个字节,就好像它是Base10数字一样

如何对二进制值数组的行进行排序,就好像它们是长二进制数一样?

为什么将两个32位整数合并为一个64位整数?

将两个 16 位寄存器转换为 32 位实值颤振

我可以遍历类成员,就好像它们是 C++ 中的数组一样吗?

在两个16位寄存器中存储无符号长值

比较字符串,就好像它们是数字一样

如何处理多个块的碰撞,就好像它们是单个实体一样?