【发布时间】:2019-04-08 02:19:59
【问题描述】:
我在汇编中编写自己的 atoi 函数时遇到了一些麻烦。说明是
"更改函数,使其返回与传递给函数的 C 字符串(指针)等效的整数。您可以假设第一个字符介于 '0' 和 '9' 之间,包括 '0' 和 '9'。 ato 应该考虑从第一个到第一个非十进制数字的所有字符。如您所见,main 将 atoi 返回的值用作退出代码(这只是访问 atoi 输出的一种廉价方法,无需编写 itoafunction .) 正如给你的,atoireturns 1234。返回值与 0xFF 进行 ANDed 以将其减少为一个字节。因此 1234 和 255 变为 210。”
# Useful constants
.equ STDIN,0
.equ STDOUT,1
.equ READ,0
.equ WRITE,1
.equ EXIT,60
# Stack frame
.equ bufferSize, 32
.equ buffer,-bufferSize
.equ localSize,16
.equ frameSize, bufferSize + localSize
# Read only data
.section .rodata # the read-only data section
prompt:
.string "Enter an integer: "
.equ promptSz,.-prompt-1
msg:
.string "You entered: "
.equ msgSz,.-msg-1
代码
.text # switch to text section
.globl __start
__start:
pushq %rbp # save caller’s frame pointer
movq %rsp, %rbp # establish our frame pointer
subq $frameSize, %rsp # for local variables
movl $promptSz, %edx # prompt size
movl $prompt, %esi # address of prompt text string
movl $STDOUT, %edi # standard out
movl $WRITE, %eax
syscall # request kernel service
movl $bufferSize,%edx
leaq buffer(%rbp), %rsi # load buffer address
movl $STDIN, %edi # standard in
movl $READ, %eax
syscall # request kernel service
movl %eax, (%rsp) # store num chars read
leaq buffer(%rbp), %rsi # load buffer address
call atoi # our exit code will be the return from atoi
movq %rbp, %rsp # delete local variables
popq %rbp # restore caller’s frame pointer
movl %eax, %edi # put exit status in %edi (will be ANDed with FF)
movl $EXIT, %eax # exit from this process
syscall
基本代码如下所示,我只需要实现自己的 atoi。到目前为止,我所拥有的 atoi 功能是
atoi:
pushq %rbp # save caller’s frame pointer
movq %rsp, %rbp # establish our frame pointer
subq $16, %rsp # for local variables
movq %rdi, -16(%rbp) #moving first argument to local variable
movl $0, -4(%rbp) #moving 0 to local variable
movl $10, -12(%rbp) #moving 10 to local variable
movl -16(%rbp), %rax
movzbl (%rax), %eax #getting value of rax
movl -4(%rbp), %eax
imull -12(%rbp), %eax
movl %eax, -4(%rbp)
movq %rbp, %rsp # delete local variables
popq %rbp # restore caller’s frame pointer
ret
我不知道下一步该去哪里。似乎我所做的任何事情都会给我带来分段错误
【问题讨论】:
-
NASM Assembly convert input to integer? 有一个很好的实现,不需要堆栈空间。
标签: linux assembly x86-64 att atoi