所以我现在正在关注本教程https://www.tutorialspoint.com/assembly_programming/assembly_arithmetic_instructions.htm,我得到的是为了将ascii中的数字转换为小数。我必须用' 0'减去它,然后执行数学计算并将其转换回ascii等效项,方法是将其添加到' 0'。然而,当数字超过9时,我的问题就出现了。
我手头有一项任务,要求我逐个循环遍历文件中的所有内容,并跟踪" count"。我不确定这样做的最佳方式是什么,但我会展示到目前为止我做了什么,它肯定不起作用,我怀疑它是因为当我转换"计数器"它的ascii值确实存在,但它匹配恰好具有该十进制值的其他字符。
--cli-input-json
答案 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中遵循这一点,你会看到它是如何工作的。