鱼C论坛

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

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

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

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

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

x
【学习交流,共同进步】
  1. assume cs:codesg            ;将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母

  2. datasg segment
  3.     db "Begibber's All-purpose Symbolic Instruction Code.",0
  4. datasg ends
  5.         
  6. codesg segment                ;提前构思,子函数一次判断字符是否为0,是则结束,否,则二次判断字符是否为字母。是则进行大小写转化,然后进入下次循环,否则直接进入下次循环。
  7. begin:mov ax,datasg         
  8.       mov ds,ax
  9.           mov si,0              ;数据段地址给予ds,si置零
  10.          
  11.           call letterc          ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
  12.                           
  13.       mov ax,4c00h          ;结束
  14.       int 21h
  15.          
  16. letterc:
  17.       push ax               ;子函数使用的寄存器的值入栈保存
  18.           push cx

  19.   s:  mov cl,ds:[si]        ;检验当前字符是否为0,是则跳转至ok(结束),否则执行后续操作
  20.           jcxz ok
  21.          
  22.           mov ah,'a'            ;检验当前字符是否为小写字母,不是则跳至s1,是则执行后续操作
  23.           mov al,'z'
  24.           cmp cl,ah
  25.           jb s1
  26.           cmp cl,al
  27.           ja s1
  28.          
  29.           and cl,11011111b      ;将当前字符由小写变成大写
  30.       mov ds:[si],cl         
  31.          
  32. s1:  inc si
  33.           jmp s
  34.       
  35.   ok: pop cx                ;子函数使用过的寄存器的值复原
  36.           pop ax
  37.          
  38.       ret                   ;返回主函数
  39.          
  40. codesg ends
  41. end begin
复制代码

感觉这些实验越来越轻松了,好好学习天天向上。求赞!

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2021-2-16 11:49:12 | 显示全部楼层
本帖最后由 jackz007 于 2021-2-16 11:53 编辑

        给你一个规范一些的汇编语言代码框架,这样的代码已经非常难找了。
  1. assume cs : code , ds : data
  2. stack segment stack para 'STACK'
  3.         dw 400h dup(00)
  4. stack ends
  5. data segment para public 'DATA'
  6.     db "Begibber's All-purpose Symbolic Instruction Code." , 0
  7. data ends
  8. code segment para public 'CODE'               
  9. letterc proc near
  10.           push ax
  11.           push si
  12.           push di
  13.           push es
  14.           push ds
  15.           pop es
  16.           push si
  17.           pop di
  18.     s1:   lodsb
  19.           or al,al
  20.           jz s3
  21.           cmp al,'a'
  22.           jb s2
  23.           cmp al,'z'
  24.           ja s2
  25.           sub al,' '
  26.     s2:   stosb
  27.           jmp s1
  28.     s3:   pop es
  29.           pop di
  30.           pop si
  31.           pop ax
  32.           ret
  33. letterc endp
  34. main proc far
  35.           mov ax,data         
  36.           mov ds,ax
  37.           mov si,0                      ;数据段地址给予ds,si置零
  38.           call letterc                  ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
  39.           mov ax,4c00h                  ;结束
  40.           int 21h
  41. main endp
  42. code ends
  43. 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改成了规范格式,并且加了注释,哈哈哈。
  1. assume  cs:code, ds:data            ;将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母

  2. stack segment stack para 'STACK'
  3.     dw 400h dup(00)
  4. stack ends

  5. data segment para public 'DATA'
  6.     db "Begibber's All-purpose Symbolic Instruction Code.",0
  7. data ends
  8.        
  9. code segment para public 'CODE'     ;提前构思,子函数一次判断字符是否为0,是则结束,否,则二次判断字符是否为字母。是则进行大小写转化,然后进入下次循环,否则直接进入下次循环。

  10. main proc far               ;主函数
  11.       mov ax,data         
  12.       mov ds,ax
  13.           mov si,0              ;数据段地址给予ds,si置零
  14.           
  15.           call letterc          ;将首地址为ds:si以0结尾的字符串中的小写字母转变为大写字母,执行完成后si指向字符串末尾的0处
  16.                           
  17.       mov ax,4c00h          ;结束
  18.       int 21h
  19. main endp
  20.           
  21. letterc proc near           ;子函数letterc
  22.       push ax               ;子函数使用的寄存器的值入栈保存
  23.           push si
  24.           push di
  25.           push es
  26.           
  27.           push ds               ;将ds的值给es,si的值给di
  28.           pop es
  29.           push si
  30.           pop di

  31. s1:  lodsb                 ;将ds:si指向的字节型数据存入al中,si自增1
  32.       or al,al              ;不修改al的值,将作为计算结果,对标志寄存器进行修改
  33.           jz ok                 ;当ZF为1(ZR)时,即al为0时,跳转至ok处结束该子程序。
  34.                                          
  35.           cmp al,'a'            ;检验当前字符是否为小写字母,不是则跳至s1,是则执行后续操作
  36.           jb s2
  37.           cmp al,'z'
  38.           ja s2
  39.           
  40.           and al,11011111b      ;将当前字符由小写变成大写,大佬用的是(sub al,' '),一样的作用,都是小写字母变大写字母          
  41.           
  42. s2:  stosb                 ;将AL寄存器的值取出来赋给es:di所指向的地址处
  43.           jmp s1
  44.       
  45.   ok: pop es                ;子函数使用过的寄存器的值复原
  46.           pop di
  47.           pop si
  48.           pop ax
  49.           
  50.       ret                   ;返回主函数
  51. letterc endp
  52.           
  53. code ends
  54. end main
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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