紧跟着上一节,这一节我们来完成把小写变大写的功能。在开始之前,我们简单说一下寄存器存放的东西。
- %eax – 缓冲区起始地址
- %ebx – 缓冲区大小
- %edi – 当前缓冲区偏移量
- %cl – 当前正在检测的字节
具体实现如下:
# 我们搜索的下边界
.equ LOWERCASE_A, 'a'
# 我们搜索的上边界
.equ LOWERCASE_Z, 'z'
# 大小写转换
.equ UPPER_CONVERSION, 'A' - 'a'
### 栈相关 ###
.equ ST_BUFFER_LEN, 8
.equ ST_BUFFER, 12
convert_to_upper:
pushl %ebp
movl %esp, %ebp
movl ST_BUFFER(%ebp), %eax
movl ST_BUFFER_LEN(%ebp), %ebx
movl $0, %edi
cmpl $0, %eax
je end_convert_loop
convert_loop:
movb (%eax, %edi, 1), %cl
cmpb $LOWERCASE_A, %cl
jl next_byte
cmpb $LOWERCASE_Z, %cl
jg next_byte
addb $UPPER_CONVERSION, %cl
movb %cl, (%eax, %edi, 1)
next_byte:
incl %edi
cmpl %edi, %ebx
jne convert_loop
end_convert_loop:
movl %ebp, %esp
popl %ebp
ret