码迷,mamicode.com
首页 > 其他好文 > 详细

汇编实现大写转小写函数

时间:2015-08-16 13:57:07      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

这个函数跟以前的写法,改变有如下几点:

  1. 用.equ伪指令,引用系统调用编号,.equ有点类似c语言里面的宏替换

  2. 用.lcomm伪指令,声明一块buffer

code:

.equ BUFFER_SIZE, 512
.equ SYS_READ, 3
.equ SYS_WRITE, 4
.equ SYS_EXIT, 1
.equ STDIN, 0
.equ STDOUT, 1
.equ OFFSET, ‘a‘ -  ‘A‘
.equ LINUX_SYSCALL, 0x80

.section .data
.section .bss
.lcomm BUFFER, BUFFER_SIZE
.section .text

.global _start
_start:
    #read(0, BUFFER, BUFFER_SIZE)
    movl $SYS_READ, %eax
    movl $STDIN, %ebx
    movl $BUFFER, %ecx
    movl $BUFFER_SIZE, %edx
    int $LINUX_SYSCALL

    #判断返回值
    cmpl $0, %eax
    jle _start_end

    #调用to_upper
    pushq %rax
    pushq $BUFFER
    call to_upper
    #复位rsp
    addq $16, %rsp

    #打印到屏幕上
    movl $SYS_WRITE, %eax
    movl $STDOUT, %ebx
    movl $BUFFER, %ecx
    movl $BUFFER_SIZE, %edx
    int $LINUX_SYSCALL

_start_end:
    #调用exit
    movl $SYS_EXIT, %eax
    xorl %ebx, %ebx
    int $LINUX_SYSCALL


.type to_upper, @function
to_upper:
    pushq %rbp
    movq %rsp, %rbp
    #获取第一个参数
    movl 16(%rbp), %edi
    #获取第二个参数
    movl 24(%rbp), %esi
    
    #edi为下标
    xorl %edx, %edx

to_upper_begin:
    #esi 下标等于长度时退出循环
    cmpl %edx, %esi
    jle to_upper_end

    #取出当前字节
    movb (%edi, %edx, 1), %cl
    incl %edx
    #如果是‘A‘ ~ ‘Z‘ 改变buffer里面的值
    cmpb $‘A‘, %cl
    jl to_upper_begin
    cmpb $‘Z‘, %cl
    jg to_upper_begin
    
    addb $OFFSET, %cl
    movb %cl, -1(%edi, %edx, 1)
    jmp to_upper_begin

to_upper_end:
    movq %rbp, %rsp
    popq %rbp
    ret

编译命令:

gcc -g -c to_upper.s && ld ./to_upper.o && ./a.out

效果:

在终端输入大写字母,这时,这时屏幕会输出小写字母

汇编实现大写转小写函数

标签:

原文地址:http://my.oschina.net/guonaihong/blog/493121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!