文档章节

汇编实现小写转大写函数(to_upper)

guonaihong
 guonaihong
发布于 2015/08/22 18:40
字数 376
阅读 242
收藏 2

1 把代码保存为to_upper.s 然后用gcc to_upper.s 然后./a.out 输入的文件名  输出的文件名 ,基中输入的文件里面如果包含小写字母,将会在输出文件里看到

2.本程序从输入文件中读取数据,把小写字母转成大写,写到输出文件中

.section .data
.section .bss

.equ BUFFER_SIZE, 512
.lcomm BUFFER, BUFFER_SIZE
.section .text

.equ SYS_READ64, 0
.equ SYS_WRITE64, 1
.equ SYS_OPEN64, 2
.equ SYS_CLOSE64, 3

.equ ST_BUFFER_SIZE, 16
.equ ARGV1, 8
.equ ARGV2, 16
.equ ST_FD_IN, -8
.equ ST_FD_OUT, -16

.equ OFFSET, 'A' - 'a'

.equ O_RDONLY, 00
.equ O_WRONLY_CREAT_TRUNC, 01101
.global main
main:

    cmpl $3, %edi
    jl main_error

    pushq %rbp
    movq %rsp, %rbp
    subq $ST_BUFFER_SIZE, %rsp
    movl $-1, ST_FD_IN(%rbp)
    movl $-1, ST_FD_OUT(%rbp)

    pushq %rsi
open_fd_in:
    movq $SYS_OPEN64, %rax
    movq ARGV1(%rsi), %rdi
    movl $O_RDONLY, %esi
    syscall
    cmpl $0, %eax
    jl main_error
    movl %eax, ST_FD_IN(%rbp)
    
    popq %rsi
open_fd_out:
    movq $SYS_OPEN64, %rax
    movq ARGV2(%rsi), %rdi
    movl $O_WRONLY_CREAT_TRUNC, %esi
    movl $0644, %edx
    syscall
    cmpl $0, %eax
    jl main_end
    movl %eax, ST_FD_OUT(%rbp)

read_write_begin:

    movq $SYS_READ64, %rax
    movl ST_FD_IN(%rbp), %edi
    movq $BUFFER, %rsi
    movl $BUFFER_SIZE, %edx
    syscall
    cmpl $0, %eax
    jle main_end

    movq %rax, %r8
    pushq %rax
    pushq $BUFFER
    call to_upper
    addq $16, %rsp

    movq $SYS_WRITE64, %rax
    movl ST_FD_OUT(%rbp), %edi
    movq $BUFFER, %rsi
    movq %r8, %rdx
    syscall
    cmpl $0, %eax
    jle main_end
    jmp read_write_begin
    
main_end:
    movq $SYS_CLOSE64, %rax
    movl ST_FD_IN(%rbp), %edi
    syscall

    movq $SYS_CLOSE64, %rax
    movl ST_FD_OUT(%rbp), %edi
    syscall
    
    xorl %eax, %eax
    movq %rbp, %rsp
    popq %rbp
    ret
main_error:
    movl $1, %eax
    ret

#小写转大写函数
.type to_upper, @function
to_upper:
    pushq %rbp
    movq %rsp, %rbp

    movq 16(%rbp), %rdi
    movl 24(%rbp), %esi

    cmpl $0, %esi
    jle to_upper_end

    xor %rcx, %rcx
to_upper_begin:
    cmpq %rcx, %rsi
    jle to_upper_end

    movb (%rdi, %rcx, 1), %bl
    incq %rcx
    
    cmpb $'a', %bl
    jl to_upper_begin
    cmpb $'z', %bl
    jg to_upper_begin
    
    addb $OFFSET, %bl
    movb %bl, -1(%rdi, %rcx, 1)
    jmp to_upper_begin

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


© 著作权归作者所有

下一篇: 汇编写文件
guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
Smarty学习篇之变量调解器

Smarty常见变量调节器 1、首字母大写capitalize 示例:{$articleTitle|capitalize} 2、字符串连接cat 示例:{$articleTitle|cat:”yesterday.”} 3、日期格式化date_format 示例:{$yesterd...

Debug客栈
2018/05/18
0
0
Oracle查询忽略大小写的实现方法

转自:http://database.51cto.com/art/201010/231561.htm Oracle查询有时候要受到一些条件的制约,比如大小写。下面为您介绍了一个实现Oracle查询忽略大小写的方法,如果您对Oracle查询方面感...

巴顿
2015/02/10
60
0
Oracle在英文匹配时大小写敏感,如何忽略大小写进行匹配

SQL Server使用英文字符串的匹配的时候默认是忽略大小写的,这样用起来是比较方便的,如果想不忽略大小写也可以修改配置,但是Oracle好像不能忽略大小写,在进行字符串匹配的时候就比较麻烦了...

浣熊干面包
2013/01/09
0
0
Python天天美味(11) - 可爱的大小写

转换大小写和其他语言一样,Python为string对象提供了转换大小写的方法:upper() 和 lower()。还不止这些,Python还为我们提供了首字母大写,其余小写的capitalize()方法,以及所有单词首字母...

zting科技
2017/01/11
0
0
字符串操作一

S.strip 函数: 可以将字符串的左右空格t等空白内容去除,该函数可以将字符串的左右两边 的空格、 t等空白内容或指定字符串去除,并返回处理后的结果,但原字符串 并未被改变。 不带参数的s...

余二五
2017/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Numpy处理图片方法

在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matp...

北方的郎
19分钟前
7
0
AMD集中擢升高管:从Intel挖了个高手

  1 月 17 日,AMD 官方宣布多项人事升迁、新人任命,擢升了四位高级副总裁:   AMD 同时还宣布, 聘请行业资深人士 Daniel McNamara 出任高级副总裁兼服务器业务部总经理,负责在第二代...

水果黄瓜
23分钟前
6
0
什么是泛型?

一、泛型的概念 泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 二、泛型的意义 一般的...

hncboy
58分钟前
7
0
dynamic-connectivity 动态连通性问题之 quick-union 算法

quick-union 的思想是:若对象 p 的 root_id 和对象 q 的 root_id 相等,则认为 p 和 q 连通。 若要将对象 p 和对象 q 连通(已知两对象未连通),则将 p 的 root_id 的值设为 q 的 root_id ...

Phpythoner_Alei
今天
51
0
OSChina 周六乱弹 —— 实在选不出来就唱国歌

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享阿冗的单曲《你的答案》。--祝大家在2020年都找到自己答案。 《你的答案》- 阿冗 手机党少年们想听歌,请使劲...

小小编辑
今天
285
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部