我正在尝试在程序集中创建此程序。 它应该只是将字符串转换为十进制
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
感谢。
答案 0 :(得分:2)
mov rcx, [rbx] ; rcx = *rbx
这是错误的,它从缓冲区加载八个字节。您只想加载1.使用mov cl,[rbx]
或movzx ecx, byte [rbx]
答案 1 :(得分:0)
FIXED:
我发现程序有什么问题= D
首先,您需要检查值10,以便
cmp rcx, 0 ; check for nul
是错误的,因为正在寻找新行ascii代码而不是null
cmp rcx, 10 ; check for NL
是对的,如果从堆栈中获取args,我认为它不起作用,当从堆栈中获取args时,你应该检查0。
第二:对于大于255的数字,echo $
?会给我错误的结果,但那没关系,因为echo $
?只能显示最多255的数字,所以即使回显可能显示错误的数字,寄存器rbx也保持正确的值。
我调试了它,现在工作正常。