LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 692|回复: 1

汇编的问题.

[复制链接]
发表于 2005-6-24 08:13:20 | 显示全部楼层 |阅读模式

  1. # args.s
  2. .text
  3. .globl _start
  4.         
  5. _start:
  6.         popl        %ecx                # argc

  7. vnext:
  8.         popl        %ecx                # argv
  9.         test         %ecx, %ecx      # 空指针表明结束
  10.         jz        exit

  11.         movl        %ecx, %ebx
  12.         xorl        %edx, %edx
  13. strlen:
  14.         movb        (%ebx), %al          ???   从这儿一直到注释有点搞不懂帮忙解释一下
  15.         inc        %edx
  16.         inc        %ebx
  17.         test        %al, %al
  18.         jnz        strlen
  19.         movb        $10, -1(%ebx)

  20.         movl        $4, %eax        # 系统调用号(sys_write)
  21.         movl        $1, %ebx        # 文件描述符(stdout)
  22.         int        $0x80

  23.         jmp        vnext

  24. exit:
  25.         movl        $1,%eax         # 系统调用号(sys_exit)
  26.         xorl        %ebx, %ebx      # 退出代码
  27.         int         $0x80
  28.                
  29.         ret

复制代码

问题在程序中
发表于 2005-6-25 12:09:57 | 显示全部楼层
Post by caicheng

  1. # args.s
  2. .text
  3. .globl _start
  4.         
  5. _start:
  6.         popl        %ecx                # argc

  7. vnext:
  8.         popl        %ecx                # argv
  9.         test         %ecx, %ecx      # 空指针表明结束
  10.         jz        exit

  11.         movl        %ecx, %ebx
  12.         xorl        %edx, %edx
  13. strlen:
  14.         movb        (%ebx), %al          ???   从这儿一直到注释有点搞不懂帮忙解释一下
  15.         inc        %edx
  16.         inc        %ebx
  17.         test        %al, %al
  18.         jnz        strlen
  19.         movb        $10, -1(%ebx)

  20.         movl        $4, %eax        # 系统调用号(sys_write)
  21.         movl        $1, %ebx        # 文件描述符(stdout)
  22.         int        $0x80

  23.         jmp        vnext

  24. exit:
  25.         movl        $1,%eax         # 系统调用号(sys_exit)
  26.         xorl        %ebx, %ebx      # 退出代码
  27.         int         $0x80
  28.                
  29.         ret

复制代码

问题在程序中

其实,strlen 这个标号已经说得很清楚了,是计算字符串长度,并将其放在 edx 中,至于为什么放在这个寄存器里面,可以参考内核关于系统调用中参数的处理。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表