本期源码,欢迎star:
https://github.com/ZYKWLJ/assembly4-homework
前置学习: 【汇编语言】11-标志寄存器
1、题目
编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母。
2、分析
有如下注意点:
1.可以包含任意字符。
2.除了小写字符其余不变。
3.小写转化为大写。
3、源码
;编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母。
assume cs:codesg,ds:datasg
datasg segment
db '@@Hello, welcome to my world! Enjoy the Linux!@@',0
datasg ends
codesg segment
start_:
;需要分析大于等于a,小于等于z,判断,在进行转换,否则不变.
mov ax,datasg ;注意,这里一定要将数据段的地址加载到ds寄存器中,因为ds段寄存器一开始在关联的数据段的前面16个字节处。这16个字节存储的是元数据,不是在数据段的起始地址处。这几乎就是固定步骤,如果有datasg的话!
mov ds,ax
mov si,0
iter_str:
mov al,[si] ;记住,这里比较的是单个字节,所以要大小匹配,使用的是al
cmp al, 0
je end_
cmp al, 'a'
jl copy_char
cmp al, 'z'
jg copy_char
and al,11011111b ;这里一定会转化为大写字符(就像使用if-else后留下的尾巴,额外处理的)
copy_char:
mov [si],al
inc si
jmp iter_str
end_:
mov ax, 4c00h
int 21h
codesg ends
end start_
注意ds段的赋值
mov ax,datasg
mov ds,ax
;注意,这里一定要将数据段的地址加载到ds寄存器中,因为ds段寄存器一开始在关联的数据段的前面16个字节处。这16个字节存储的是元数据,不是在数据段的起始地址处。这几乎就是固定步骤,如果有datasg的话!
结果



4、总结
这里使用 j类跳转指令 实现了if-else的开发,更加底层,这也说明了,if-else上层语言的开发,无非是这些底层堆砌而来的!

本系列将精讲Linux0.11内核中的每一个文件,共计会发布100+文章。
😉【Linux102】11-kernel/vsprintf.c
😉【Linux102】12-include/stdarg.h
😉【Linux102】14-kernel/system_call.s
😉【Linux102】15-include/linux/sched.h
😉【Linux102】18-include/signal.h
😉【Linux102】19-include/sys/types.h
😉【Linux102】20-include/linux/kernel.h
😉【Linux102】21-include/asm/segment.h
😉【Linux102】22-include/linux/head.h
😉【Linux102】23-include/linux/mm.h
😉【Linux102】24-include/linux/fs.h
😉【Linux102】26-include/sys/wait.h
😉【Linux102】27-include/inux/tty.h
😉【Linux102】28-include/termios.h
😉【Linux102】30-include/sys/times.h
😉【Linux102】31-include/sys/utsname.h
😉【Linux102】32-include/stddef.h
😉【Linux102】33-include/linux/sys.h
😉【Linux102】36-include/asm/system.h
😉【Linux102】38-include/linux/fdreg.h
😉【Linux102】39-include/asm/io.h
😉【Linux102】40-kernel/blk_drv/blk.h
😉【Linux102】41-kernel/blk_drv/hd.c
😉【Linux102】42-include/linux/config.h
😉【Linux102】43-include/linux/hdreg.h
😉【Linux102】45-kernel/blk_drv/ramdisk.c
😉【Linux102】46-include/asm/memory.h
😉【Linux102】47-include/string.h
😉【Linux102】48-kernel/blk_drv/floppy.c
😉【Linux102】49-kernel/chr_drv/keyboard.S
😉【Linux102】50-kernel/chr_drv/console.c
😉【Linux102】51-kernel/chr_drv/serial.c
😉【Linux102】52-kernel/chr_drv/rs_io.s
😉【Linux102】53-kernel/chr_drv/tty_io.c
😉【Linux102】56-kernel/chr_drv/tty_ioctl.c
和Linux内核102系列不同,本系列将会从全局描绘Linux内核的各个模块,而非逐行源码分析,适合想对Linux系统有宏观了解的家人阅读。
😉【Linux】Linux概述1-linux对物理内存的使用
本系列将带领大家从0开始循序渐进学习汇编语言,直至完全掌握这门底层语言。同时给出学习平台DOSBox的使用教程。
本系列将直击C语言的本质基础,流利处理出各个易错、实用的实战点,并非从零开始学习C。
关于小希
😉嘿嘿嘿,我是小希,专注Linux内核领域,同时讲解C语言、汇编等知识。
我的微信:C_Linux_Cloud,期待与您学习交流!

加微信请备注哦
小希的座右铭:
别看简单,简单也是难。别看难,难也是简单。我的文章都是讲述简单的知识,如果你喜欢这种风格:
下一期想看什么?在评论区留言吧!我们下期见!

1431

被折叠的 条评论
为什么被折叠?



