【问题标题】:Assembly: Help with get utf8 char function程序集:帮助获取 utf8 char 函数
【发布时间】:2011-05-01 12:31:50
【问题描述】:

尝试编写一个汇编函数,返回 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

参数为 unsigned char* 和 int。

但它不会返回正确的字符。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:
    1. 最大的问题是第一个参数位于8(%ebp) - 而不是包含返回地址的4(%ebp)
    2. 我认为您想在检查 %ecx 之后增加 %eax,而不是之前。
    3. 您真的是指 UTF-8 吗? UTF-8 是多字节字符编码:nth UTF-8 character 不一定是 nth 字节(需要更多的努力来计算字符并解码您感兴趣的字符)。

    【讨论】:

    • 我应该返回第n个字节,而不是我写的char...我尝试进行一些更改,结果几乎是正确的。但是我在我不想要的那个字节之前得到了这个字节,似乎......
    • 我以为第一个参数是在 4(%ebp) 找到的,而返回地址是在 0(%ebp) 或者只是 (%ebp)..
    • 进入utf8_get,返回地址是(%esp),第一个参数是4(%esp)。但序言pushl %ebp ; movl %esp, %ebp 在推送中将堆栈指针递减 4 个字节,然后再复制它 - 所以在那之后旧的%ebp 位于(%ebp),返回地址位于4(%ebp),第一个参数在8(%ebp)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多