【问题标题】:How many bits (or bytes) are we subtracting in assembly when using $ - x使用 $ - x 时,我们在汇编中减去了多少位(或字节)
【发布时间】:2015-01-08 19:18:12
【问题描述】:

这是我的源代码:

SECTION .data
EatMsg: db "Hello Koray",10
EatLen: equ $-EatMsg
SECTION .bss
SECTION .text
global main
main:
    nop
    mov eax,4
    mov ebx,1
    mov ecx,EatMsg
    mov edx,EatLen
    int 80H
    mov eax,1
    mov ebx,0
    int 80H

我的问题是关于这部分的:

EatLen: equ $-EatMsg

我的理解是 EatLen 是一个 Label(内存地址),其中 $ - x 的值是保持的..

但这里的 EatMsg 是什么?字符串 EatMsg 由 14 个字符组成,但使用的编码是什么?如果使用 ASCII,那么所有字符都是 7(或 8?)位,不是吗?但是,这是怎么回事:

EatLen: equ $-EatMsg-2

例如,在控制台中我会看到:

你好科拉

所以 -2 实际上会删除 2 个字符,但这意味着什么,14 位(或 16)?汇编中的每个字符都是一个字节吗?

但我也尝试使用“ğğğüüşşüşü”等字符,但“$-EatMsg-2”再次删除了我减去的字符数。我很确定 "ğ" 不适合 8 位,那么 -1 怎么会从控制台中看到的字符串中准确删除 1 个 "ğ"?

我希望我想问的问题很清楚,抱歉英语不是我的母语。

我正在开发 32 位 Ubuntu (v12)(如果有的话),这是我创建可执行文件的方式:

koray@koray-VirtualBox:~/asm/blog$ nasm -f elf -g -F dwarf sandbox.asm
koray@koray-VirtualBox:~/asm/blog$ gcc -o sandbox sandbox.o
koray@koray-VirtualBox:~/asm/blog$ gdb sandbox -tui

【问题讨论】:

    标签: linux ubuntu assembly encoding


    【解决方案1】:

    $ 是二进制文件中的当前位置

    EatMessage这里是对应标签的地址,所以是字符串"Hello Koray",10的地址

    因此,当您编写$-EatMsg 时,您正在计算该字符串的开头与您现在所在位置之间的差异。您正在计算 EatMsg 和 EatLen 地址之间的差异。

    因为我们只是在字符串之后,所以它等于字符串的长度(以字节为单位)。

    字符串 EatMsg 由 14 个字符组成,但使用的编码是什么?如果使用ASCII,那么所有字符都是7(或8?)位,不是吗?

    你写了 'db "Hello Koray",10',所以你正在创建一个字节串。

    所以 -2 实际上会删除 2 个字符,但这意味着什么,14 位(或 16)?汇编中的每个字符都是一个字节吗?

    -2 从长度中减去 2 个字节。不是位,是字节。 你正在做的是告诉系统调用写入 11-2=9 个字节,而你的字符串仍然是 11 个字节长。 每个字符在这里恰好是 1 个字节长(只要你坚持使用 ASCII),所以这将少打印 2 个字符。

    如果您的字符串包含非 ASCII 字符,这些字符将被编码为多个字节。 例如,如果你写

    EatMsg: db "Hello Korayğ",10
    EatLen: equ $-EatMsg-2
    

    这将打印Hello Koray�,因为您不打印最后一个换行符,并且您不打印 ğ 的最后一个字节,因此您分成两半的最后一个 ğ 字符成为无效的 UTF-8 字符。

    编辑:显然,并非所有终端都显示 � 字符,但您可以通过查看列表文件(nasm 的标志 -l)来了解字符串是如何编码的

    【讨论】:

    • 但是当我减去例如 -EatMsg-2 时它也有效。那么恰好 2 个字符将不会被打印。这是否意味着每个字符都是一个字节长,而我们实际上又减去了 2 个字节?
    • 是的。每个字符都是一个字节,因为您使用了db
    • 但是 "ğ" 怎么能适合一个字节呢?我不确定只是因为我使用了“db”每个字符都是一个字节......
    • 您的字符串将以 UTF-8 编码,因此这些字符将占用超过 1 个字节。
    • 这正是我要说的,那么如果只是减去 2 个字节,为什么 -2 仍然有效?再次从字符串中删除 2 个 "ğğ" ..
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多