Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编:获取utf8字符函数的帮助_Assembly_X86 - Fatal编程技术网

Assembly 汇编:获取utf8字符函数的帮助

Assembly 汇编:获取utf8字符函数的帮助,assembly,x86,Assembly,X86,尝试编写一个汇编函数,返回utf-8文本中给定位置的字符 我已经尝试了很多解决方案,但我不能让它正常工作。这就是我到目前为止所做的: .globl utf8_get .globl _utf8_get utf8_get: _utf8_get: pushl %ebp movl %esp, %ebp movl 4(%ebp), %eax movl 12(%ebp), %ecx u_loop: cmp

尝试编写一个汇编函数,返回utf-8文本中给定位置的字符

我已经尝试了很多解决方案,但我不能让它正常工作。这就是我到目前为止所做的:

    .globl utf8_get
    .globl _utf8_get
utf8_get:
_utf8_get:
        pushl   %ebp
        movl    %esp, %ebp
        movl    4(%ebp), %eax
        movl    12(%ebp), %ecx

u_loop: cmpb    $0x0, (%eax)
        jz      n_fnd
        incl    %eax
        cmpl    $0x0, %ecx
        jz      fnd
        decl    %ecx
        jmp     u_loop

n_fnd:  movl    $-0x1, %eax
        popl    %ebp
        ret

fnd:    movzbl  (%eax), %eax
        popl    %ebp
        ret
参数为无符号char*和int

但它不会返回正确的字符

  • 最大的问题是第一个参数位于
    8(%ebp)
    -而不是
    4(%ebp)
    ,它包含返回地址
  • 我想您应该在检查
    %ecx
    之后,而不是之前,增加
    %eax
  • 你真的是说UTF-8吗?是一种多字节字符编码:第n个UTF-8字符不一定是第n个字节(计算字符数和解码您感兴趣的字符需要付出更多的努力)

  • 我应该返回第n个字节,而不是我写的字符。。。我试着做了一些改变,结果几乎是对的。但是我得到的字节比我不想要的字节早,似乎…我认为第一个参数是在4(%ebp)处找到的,返回地址是在0(%ebp)或仅仅是(%ebp)…在进入
    utf8\u get
    时,返回地址是在
    (%esp)
    ,第一个参数是在
    4(%esp)
    。但是开场白
    push%ebp;movl%esp,%ebp
    在复制堆栈指针之前,在推送过程中将堆栈指针递减4字节-因此,在旧的
    %ebp
    位于
    (%ebp)
    之后,返回地址位于
    4(%ebp)
    ,第一个参数位于
    8(%ebp)