linux转小写函数,汇编实现大写转小写函数(to_lower)

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

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

用.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_lower

pushq %rax

pushq $BUFFER

call to_lower

#复位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_lower, @function

to_lower:

pushq %rbp

movq %rsp, %rbp

#获取第一个参数

movl 16(%rbp), %edi

#获取第二个参数

movl 24(%rbp), %esi

#edi为下标

xorl %edx, %edx

to_lower_begin:

#esi 下标等于长度时退出循环

cmpl %edx, %esi

jle to_lower_end

#取出当前字节

movb (%edi, %edx, 1), %cl

incl %edx

#如果是'A' ~ 'Z' 改变buffer里面的值

cmpb $'A', %cl

jl to_lower_begin

cmpb $'Z', %cl

jg to_lower_begin

addb $OFFSET, %cl

movb %cl, -1(%edi, %edx, 1)

jmp to_lower_begin

to_lower_end:

movq %rbp, %rsp

popq %rbp

ret

编译命令:

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

效果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值