【发布时间】:2021-02-19 16:13:03
【问题描述】:
我的目标是将x86-assembly 中字符串some_str 的第一个字符与最后一个字符交换。
这是我的尝试:
; assemble and link with:
; nasm -f elf32 -g test.asm && ld -melf_i386 test.asm.o -o test
section .text
global _start
extern printf
_start:
mov eax, some_str
_loop:
mov di, [eax + 4] ; ptr to end char
mov si, [eax] ; ptr to start char
mov dl, [di] ; DL = end char
mov al, [si] ; AL = start char
mov [si], dl ; start char = end char
mov [di], al ; end char = char 1
mov edx, len
mov ecx, eax
mov ebx, 1
mov eax, 4
int 0x80
ret
mov eax, 1
int 0x80
section .data
some_str db `abcd`, 0xa
len equ $ - some_str
出于某种原因,我忘记了这些台词:
mov dl, [di] ; DL = end char
mov al, [si] ; AL = start char
导致程序导致分段错误。
预期的标准输出是:
dbca
实际标准输出:
Segmentation fault (core dumped)`
我有什么遗漏吗?如何更正此代码以正确交换 some_str 的第一个和最后一个字符。
【问题讨论】:
-
1.当您希望它们具有指针时,看起来您正在将字节加载到
di和si中。 2. 如果您使用的是 32 位,那么您应该使用esi和edi,因为指针是 32 位宽的。 3. 在调试器中单步查看寄存器中的值,你肯定会发现一些不对劲的地方。
标签: string parsing assembly x86 cpu-registers