在NASM Assembly中打印出大于9的数字

时间:2016-10-01 04:37:45

标签: assembly nasm

所以我现在正在关注本教程https://www.tutorialspoint.com/assembly_programming/assembly_arithmetic_instructions.htm,我得到的是为了将ascii中的数字转换为小数。我必须用' 0'减去它,然后执行数学计算并将其转换回ascii等效项,方法是将其添加到' 0'。然而,当数字超过9时,我的问题就出现了。

我手头有一项任务,要求我逐个循环遍历文件中的所有内容,并跟踪" count"。我不确定这样做的最佳方式是什么,但我会展示到目前为止我做了什么,它肯定不起作用,我怀疑它是因为当我转换"计数器"它的ascii值确实存在,但它匹配恰好具有该十进制值的其他字符。

--cli-input-json

1 个答案:

答案 0 :(得分:0)

在你的情况下,因为你要进行字符计数,所以使用二进制处理器自然数系统会更实际。然后,将其转换为十进制。在这个例子中,假设您计算了301,927个字符。这将是二进制的0x49b67。此片段将执行转换,然后使用指向ASCII转换字符串的RDI完成。

我没有32位机器,所以你所要做的就是取出以“r”开头的REX限定符更改寄存器到“e”然后同样可以工作对你而言。

        section .text
        global  _start

 _start     push    byte 0              ; So ASCII string will be terminated
                                        ; with NULL
            mov     rdi, rsp
            mov     eax, 0x49b67        ; = 301927
            mov     ecx, 10

         Div:
            xor     edx, edx
            div     ecx                 ; DL = digit 0 - 9
            or       dl, '0'
            mov     [rdi], dl
            dec     rdi
            or      eax, eax            
            jnz     Div

            inc     rdi                 ; RDI now points to ASCII string

我在退出程序结束时离开了程序,因为在64位我使用SYSCALL而你使用INT 0x80,但在GDB中遵循这一点,你会看到它是如何工作的。