如何在程序集AT& T中用,
分隔符分割字符串?
这是我的字符串:6,3,2431,7,9,1221
我想在,
之间的所有数字中添加1。
结果应为:7, 4, 2432, 8, 10, 1222
我正在使用ubuntu14 - 64位,intel cpu和GAS编译器
答案 0 :(得分:1)
伪代码:
; si = input string
di = output string
if 0 == [si] jmp NoNumberFound
NextNumberLoop:
rax = 0
ReadLoop:
bl = [si] & inc si
if 0 == bl jmp LastNumberFound
if ',' == bl jmp CommaFound
rax = rax*10 + (bl-'0') ; extend bl to 64b of course
jmp ReadLoop
CommaFound:
call StoreNumberPlusOne
[di]=',' & inc di
jmp NextNumberLoop
LastNumberFound:
call StoreNumberPlusOne
NoNumberFound:
[di]='0'
output resulting string and exit.
StoreNumberPlusOne:
inc rax (number+1)
print decimal formatted rax to [di] + make di point after it
ret
(64b平台上的di / si指针当然是rsi / rdi等等......它只是伪代码显示算法,不是字面意思)
其他选项是在字符串本身中进行而不解析数字。
为结果字符串分配足够大的缓冲区(如果将输入设置为n
次9
,输出缓冲区将几乎是输入缓冲区的两倍,包含n
次{{ 1}})。
将输入字符串复制到outputBuffer,并在其最后一个字符处指针10
。
ptr