【发布时间】:2011-08-01 17:54:44
【问题描述】:
我正在尝试在汇编中制作这个程序。 它应该只是将字符串转换为小数
int main (int argc, char **argv)
{
int result = 0;
char *c = argv[1];
while(*c != 0)
{
result *= 10;
result += (*c - 48);
c++;
}
return result;
}
但没有从堆栈中获取 argv...所以我在 asm 中编写了一些我认为应该这样做但它不起作用的代码。
谁能指出我做错了什么? 我评论了代码,所以你会知道我的想法,请纠正我的任何事情。
section .bss
buf resb 8 ; define an array of 8 uninitialised bytes
section .text
global _start
_start:
mov rax, 3 ; system call number (sys_read)
xor rbx, rbx ; file descriptor 0 (stdin)
mov rcx, buf ; buffer to store data
mov rdx, 8 ; Lenght of buffer
int 0x80
xor rax,rax ; rax = 0
mov rbx, buf ; rbx = &buf
xor rcx, rcx
StrToDec:
mov cl, [rbx] ; cl = *rbx
cmp rcx, 0 ; check for nul THIS IS WRONG
cmp rcx, 10 ; we have to check for NL ascii code
je end ; if rcx == 0 goto end
imul rax, 10 ; rax *= 10
sub rcx, 48 ; rcx -= 48 (48 is acii for '0')
add rax, rcx ; rax += rcx
inc rbx ; rbx++
jmp StrToDec
end:
mov rbx, rax ; rbx = rax
mov rax, 1 ; rax = 1
int 0x80
例如当我运行这个程序并输入 100 然后输入 echo $?到终端它应该打印 100
谢谢。
【问题讨论】:
-
你得到了什么结果?
-
什么是“不起作用”?
-
输入 100 时返回 194,输入 10 时返回 62
-
你能再举几个例子吗?当您输入
543或1000时会发生什么?