汇编语言_实验11
【学习交流,共同进步】assume cs:codesg ;将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母
datasg segment
db "Begibber's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment ;提前构思,子函数一次判断字符是否为0,是则结束,否,则二次判断字符是否为字母。是则进行大小写转化,然后进入下次循环,否则直接进入下次循环。
begin:mov ax,datasg
mov ds,ax
mov si,0 ;数据段地址给予ds,si置零
call letterc ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
mov ax,4c00h ;结束
int 21h
letterc:
push ax ;子函数使用的寄存器的值入栈保存
push cx
s:mov cl,ds: ;检验当前字符是否为0,是则跳转至ok(结束),否则执行后续操作
jcxz ok
mov ah,'a' ;检验当前字符是否为小写字母,不是则跳至s1,是则执行后续操作
mov al,'z'
cmp cl,ah
jb s1
cmp cl,al
ja s1
and cl,11011111b ;将当前字符由小写变成大写
mov ds:,cl
s1:inc si
jmp s
ok: pop cx ;子函数使用过的寄存器的值复原
pop ax
ret ;返回主函数
codesg ends
end begin
感觉这些实验越来越轻松了,好好学习天天向上。求赞! 本帖最后由 jackz007 于 2021-2-16 11:53 编辑
给你一个规范一些的汇编语言代码框架,这样的代码已经非常难找了。
assume cs : code , ds : data
stack segment stack para 'STACK'
dw 400h dup(00)
stack ends
data segment para public 'DATA'
db "Begibber's All-purpose Symbolic Instruction Code." , 0
data ends
code segment para public 'CODE'
letterc proc near
push ax
push si
push di
push es
push ds
pop es
push si
pop di
s1: lodsb
or al,al
jz s3
cmp al,'a'
jb s2
cmp al,'z'
ja s2
sub al,' '
s2: stosb
jmp s1
s3: pop es
pop di
pop si
pop ax
ret
letterc endp
main proc far
mov ax,data
mov ds,ax
mov si,0 ;数据段地址给予ds,si置零
call letterc ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
mov ax,4c00h ;结束
int 21h
main endp
code ends
end main jackz007 发表于 2021-2-16 11:49
给你一个规范一些的汇编语言代码框架,这样的代码已经非常难找了。
好的,谢谢啦!{:10_323:}
也祝您新年快乐,哈哈哈{:10_275:} 在楼上大佬帮助下,我把实验11改成了规范格式,并且加了注释,哈哈哈。
assumecs:code, ds:data ;将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母
stack segment stack para 'STACK'
dw 400h dup(00)
stack ends
data segment para public 'DATA'
db "Begibber's All-purpose Symbolic Instruction Code.",0
data ends
code segment para public 'CODE' ;提前构思,子函数一次判断字符是否为0,是则结束,否,则二次判断字符是否为字母。是则进行大小写转化,然后进入下次循环,否则直接进入下次循环。
main proc far ;主函数
mov ax,data
mov ds,ax
mov si,0 ;数据段地址给予ds,si置零
call letterc ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
mov ax,4c00h ;结束
int 21h
main endp
letterc proc near ;子函数letterc
push ax ;子函数使用的寄存器的值入栈保存
push si
push di
push es
push ds ;将ds的值给es,si的值给di
pop es
push si
pop di
s1:lodsb ;将ds:si指向的字节型数据存入al中,si自增1
or al,al ;不修改al的值,将作为计算结果,对标志寄存器进行修改
jz ok ;当ZF为1(ZR)时,即al为0时,跳转至ok处结束该子程序。
cmp al,'a' ;检验当前字符是否为小写字母,不是则跳至s1,是则执行后续操作
jb s2
cmp al,'z'
ja s2
and al,11011111b ;将当前字符由小写变成大写,大佬用的是(sub al,' '),一样的作用,都是小写字母变大写字母
s2:stosb ;将AL寄存器的值取出来赋给es:di所指向的地址处
jmp s1
ok: pop es ;子函数使用过的寄存器的值复原
pop di
pop si
pop ax
ret ;返回主函数
letterc endp
code ends
end main
页:
[1]