王爽《汇编语言》第十一章 实验十一 题目解答

这里写图片描述

下面是代码:

; 要求:将ds:[si]开始,以0结束的字符串中的小写字母变为大写字母显示。
; 概要算法:小写字母的范围为61~7A,比大写字母多20,所以算法就是判断是否为小写字母,如果为小写字母则减掉20
; 详细算法:
; 1、结尾字节为0,所以可以使用jcxz来判断整个字符串的结束,这已经是常用手法了。。。
; 2、对每个字节作判断,一种方法是直接判断(判断 大于61和小于7A),一种是间接判断(判断小于61和大于7A)。是小写字母的则减去20
; 3、重复循环

assume cs:code

data segment
 db "Beginer's All-purpose Symbolic Instruction Code", 0
data ends

stack segment

stack ends

code segment

Main:
 mov ax, data
 mov ds, ax
 mov si, 0
 call letterc

 mov si, 0
 mov dh, 3
 mov dl, 2
 mov cl, 2
 call show_str

 mov ah, 01h
 int 21h

 mov ax, 4c00h
 int 21h


; 名称:letterc
; 功能:将小写
; 参数:ds:[si] 开始,以0结束的字符串
; 返回:无
letterc:
 mov ch, 0

s_letterc:
  mov cl, ds:[si]
  jcxz end_letterc ; 字节为0就结束

  cmp cl, 61h
  jb s0_letterc ; 小于61
  cmp cl, 07ah
  ja s0_letterc ; 大于7A

  sub cl, 20h
  mov ds:[si], cl

s0_letterc:
  inc si
  jmp short s_letterc

end_letterc:
  ret

; 名称:show_str
; 功能:指定位置,用指定颜色,显示一个用0结束的字符串
; 参数:(dh) =  行号(0--24),(dl) = 列号(0--79)
;  (cl) = 颜色,ds:si 指向字符串的首地址
; 返回:无
show_str:
  push ax
  push bx
  push cx
  push dx
  push es

  ; 计算好字串开始显示的地址Y = 160*(行数-1) + 列数*2-2, B800 : Y
  ; 循环将参数里的字串写进显卡内存,并检测到0就返回

  ; bx = 160*(行数-1)
  sub dh, 1h
  mov al, 160
  mul dh
  mov bx, ax ; bx 为根据行数算出来的偏移值

  ; ax = 列数*2-2
  mov al, 2
  mul dl
  sub ax, 2 ; 根据列数算出来的偏移值 
  add bx, ax ; 行数和列数的和存在bx中了

  mov ax, 0b800h
  mov es, ax

  mov dl, cl ; 保存字体颜色属性
  mov ch, 0

 s_show_str:
  mov  cl, ds:[si]
  mov  es:[bx], cl
  jcxz ok_show_str

  mov es:[bx+1], dl

  inc si
  add bx, 2
  jmp short  s_show_str

 ok_show_str:
  pop es
  pop dx
  pop cx
  pop bx
  pop ax

  ret



code ends

end Main
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值