鱼C论坛

 找回密码
 立即注册
查看: 4729|回复: 3

[汇编作业] 汇编语言_实验11

[复制链接]
发表于 2021-2-16 11:12:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【学习交流,共同进步】
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:[si]        ;检验当前字符是否为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:[si],cl          
          
 s1:  inc si
          jmp s
      
  ok: pop cx                ;子函数使用过的寄存器的值复原
          pop ax
          
      ret                   ;返回主函数
          
codesg ends
end begin
感觉这些实验越来越轻松了,好好学习天天向上。求赞!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-16 11:49:12 | 显示全部楼层
本帖最后由 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-16 12:41:45 | 显示全部楼层
jackz007 发表于 2021-2-16 11:49
给你一个规范一些的汇编语言代码框架,这样的代码已经非常难找了。

好的,谢谢啦!
也祝您新年快乐,哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-16 15:09:05 | 显示全部楼层
在楼上大佬帮助下,我把实验11改成了规范格式,并且加了注释,哈哈哈。
assume  cs: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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 16:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表