Assembly eax与其他寄存器的不同行为
我已经编写了一个小的汇编代码段(Gas,32位),它接受一个命令行参数,计算其字符数,如果字符串有一定的长度(仅用于调试目的),则打印该字符串。我对汇编还比较陌生,所以我很确定我在这里遗漏了一些东西,因为当我在eax中存储字符串时,与ecx、edx或esi相比,我得到了不同的行为 下面是片段。用eax替换esi时,无论字符串有多长,循环只输入两次,因此计数器(ebx)始终为1。使用esi或其他寄存器,一切似乎都正常工作Assembly eax与其他寄存器的不同行为,assembly,cpu-registers,Assembly,Cpu Registers,我已经编写了一个小的汇编代码段(Gas,32位),它接受一个命令行参数,计算其字符数,如果字符串有一定的长度(仅用于调试目的),则打印该字符串。我对汇编还比较陌生,所以我很确定我在这里遗漏了一些东西,因为当我在eax中存储字符串时,与ecx、edx或esi相比,我得到了不同的行为 下面是片段。用eax替换esi时,无论字符串有多长,循环只输入两次,因此计数器(ebx)始终为1。使用esi或其他寄存器,一切似乎都正常工作 .section .text .globl _start _start:
.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
谁能告诉我我做错了什么/误解了什么
问候
al
寄存器实际上是eax
寄存器的最低8位。因此,指令movb(%eax),%al
将销毁eax
的最低8位,即指针
作为一般建议,学习使用调试器逐步检查代码,并确定计算机在何处执行与预期不同的操作
编辑:在发布的代码中有一些无关紧要的语法错误(例如
ebc
而不是ebx
),但我假设有一些复制错误,因为您说它可以正常工作。Full ack。谢谢你的解释,当然这是正确的答案。