635924705 发表于 2021-2-16 11:12:29

汇编语言_实验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: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

635924705 发表于 2021-2-16 12:41:45

jackz007 发表于 2021-2-16 11:49
给你一个规范一些的汇编语言代码框架,这样的代码已经非常难找了。

好的,谢谢啦!{:10_323:}
也祝您新年快乐,哈哈哈{:10_275:}

635924705 发表于 2021-2-16 15:09:05

在楼上大佬帮助下,我把实验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]
查看完整版本: 汇编语言_实验11