【发布时间】: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