我编写了一个小的汇编代码片段(Gas,32 位),它接受命令行参数,计算其字符并打印字符串(如果它具有一定的长度)(仅用于调试目的)。我对汇编比较陌生,所以我很确定我在这里错过了一些东西,因为当我将字符串存储在 eax 中时,与 ecx、edx 或 esi 等相比,我会得到不同的行为。
这是片段。当您用 eax 替换 esi 时,无论字符串有多长,循环都只会进入两次,因此计数器 (ebx) 始终为 1。使用 esi 或其他寄存器,一切似乎都工作正常。
.section .text
.globl _start
_start:
movl %esp, %ebp
movl 0(%ebp), %eax # get argc
cmpl $2, %eax # ensure argc == 2
jne _exit
movl 8(%ebp), %eax # get argv[1]
movl $0, %ebx # set counter to 0
_begin_loop:
movb (%eax), %al # load a character into %al
cmpb $0, %al # see if \0 is reached
je _end_loop # exit loop if at end of string
incl %ebc # increment counter
incl %eax # advance string
jmp _begin_loop
_end_loop:
cmpl $6, %ebx # print the string if it's six characters long
jne _exit
movl $4, %eax # prepare for output
movl $1, %ebx
movl 8(%ebp), %ecx)
movl $6, %edx
int 0x80
_exit:
movl $1, %eax
movl $0, %ebx
int 0x80
有人可以给我一个关于我做错/误解的提示吗?
Greets
The al
寄存器实际上是最低8位eax
登记。所以,指令movb (%eax), %al
破坏最低8位eax
,那就是你的指针。
作为一般建议,学习使用调试器单步调试代码并找出计算机执行与您期望不同的操作的地方。
编辑:发布的代码中有一些微不足道的语法错误(例如ebc
代替ebx
),但我假设有一些复制错误,因为你说否则它可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)