
十万火急!!汇编语言的问题
本人不会汇编语言,但是有C语言基础,麻烦各位帮我解释一下下面的语句#args.s.text.globlstart_start:popl%ecx#argcvnext:pop...
本人不会汇编语言,但是有C语言基础,麻烦各位帮我解释一下下面的语句
# args.s
.text
.globl start
_start:
popl %ecx # argc
vnext:
popl %ecx # argv
test %ecx, %ecx # 空指针表明结束
jz exit
movl %ecx, %ebx
xorl %edx, %edx
strlen:
movb (%ebx), %al
inc %edx
inc %ebx
test %al, %al
jnz strlen
movb $10, -1(%ebx)
movl $4, %eax # 系统调用号(sys_write)
movl $1, %ebx # 文件描述符(stdout)
int $0x80
jmp vnext
exit:
movl $1,%eax # 系统调用号(sys_exit)
xorl %ebx, %ebx # 退出代码
int $0x80
ret
急急急 展开
# args.s
.text
.globl start
_start:
popl %ecx # argc
vnext:
popl %ecx # argv
test %ecx, %ecx # 空指针表明结束
jz exit
movl %ecx, %ebx
xorl %edx, %edx
strlen:
movb (%ebx), %al
inc %edx
inc %ebx
test %al, %al
jnz strlen
movb $10, -1(%ebx)
movl $4, %eax # 系统调用号(sys_write)
movl $1, %ebx # 文件描述符(stdout)
int $0x80
jmp vnext
exit:
movl $1,%eax # 系统调用号(sys_exit)
xorl %ebx, %ebx # 退出代码
int $0x80
ret
急急急 展开
展开全部
gas汇编指令 你可以google对照看下- -
我学的Intel汇编那本书快2星期了,大部分指令和这个不同。。。。
我把知道的先说出来,希望对你有用,如果有兴趣你也去看书吧,至少这些基础命令和概念大概1~2星期可以掌握掌握。
popl %ecx ----->出栈 到ecx 寄存器中。
test %ecx, %ecx ------>就是一个资深‘与’运算,但是不改变值,就是为了下面语句'jz'做判断用的
jz exit ------> 如果上面‘与’运算为0,标示空,则标志位 零位(z) 会被置位,jz意思就是如果z被置位则跳转到 exit: 出开始执行下面语句。
movl %ecx, %ebx 将ecx寄存器中的值复制给 ebx
xorl %edx, %edx 是edx资深 做一个 ‘异或’运算,相同位为0,所以edx被初始化为0了
movb (%ebx), %al 将ebx中的一个字节(8位)复制给 al(al是eax的低8位)
inc %edx edx值增加1
inc %ebx
test %al, %al 不改变值的‘与’运算,al若为0则 z被置位
jnz strlen 如果 z没有置位则跳转到 strlen处开始运行
movb $10, -1(%ebx)
movl $4, %eax # 系统调用号(sys_write)
int $0x80
jmp vnext 直接跳转到 vnext:处开始运行
exit:
movl $1,%eax # 系统调用号(sys_exit)
xorl %ebx, %ebx # 退出代码
int $0x80
ret ----> 这个就当做是c语言函数里的 return
我学的Intel汇编那本书快2星期了,大部分指令和这个不同。。。。
我把知道的先说出来,希望对你有用,如果有兴趣你也去看书吧,至少这些基础命令和概念大概1~2星期可以掌握掌握。
popl %ecx ----->出栈 到ecx 寄存器中。
test %ecx, %ecx ------>就是一个资深‘与’运算,但是不改变值,就是为了下面语句'jz'做判断用的
jz exit ------> 如果上面‘与’运算为0,标示空,则标志位 零位(z) 会被置位,jz意思就是如果z被置位则跳转到 exit: 出开始执行下面语句。
movl %ecx, %ebx 将ecx寄存器中的值复制给 ebx
xorl %edx, %edx 是edx资深 做一个 ‘异或’运算,相同位为0,所以edx被初始化为0了
movb (%ebx), %al 将ebx中的一个字节(8位)复制给 al(al是eax的低8位)
inc %edx edx值增加1
inc %ebx
test %al, %al 不改变值的‘与’运算,al若为0则 z被置位
jnz strlen 如果 z没有置位则跳转到 strlen处开始运行
movb $10, -1(%ebx)
movl $4, %eax # 系统调用号(sys_write)
int $0x80
jmp vnext 直接跳转到 vnext:处开始运行
exit:
movl $1,%eax # 系统调用号(sys_exit)
xorl %ebx, %ebx # 退出代码
int $0x80
ret ----> 这个就当做是c语言函数里的 return
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询