call-综合练习1

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 清屏+打印字符+大写
assume cs:code,ds:data,ss:stack

data segment
           db 'conversation',0      ; 0 是为了 jcxz
data ends

stack segment stack
            db 128 dup(0)
stack ends

code segment
      start:
                           mov  ax, stack
                           mov  ss,ax
                           mov  sp,128

                           call init_reg                        ; 初始化ds:data, es:0B800H的数据
                           call clear_screen                    ; 清屏的效果
                           call show_conversation
                           call up_letter
                           call re_show_conversation

      testA:
                           mov  ax,1000H
                           jmp  testA
                           mov  ax,4c00h
                           int  21h

      up_letter:
                           mov  si,0
                           call up_letter1
                           ret
      up_letter1:
                           push cx
                           push ds
                           push si
                           push di
                           mov  cx,0
      up_letter2:
                           mov  cl, ds:[si]
                           jcxz up_letter3
                           and  byte ptr ds:[si],11011111B
                           inc  si
                           jmp  up_letter2
      up_letter3:
                           pop  di
                           pop  si
                           pop  ds
                           pop  cx
                           ret


      show_conversation:
                           mov  si,0
                           mov  di,160*10 + 40*2                ; 0690H
                           call show_conversation1
                           ret
      re_show_conversation:
                           mov  si,0
                           mov  di,160*11 + 40*2                ; 0690H
                           call show_conversation1
                           ret
      show_conversation1:
                           push cx
                           push ds
                           push es
                           push si
                           push di
                           mov  cx,0
      show_conversation2:
                           mov  cl, ds:[si]
                           jcxz show_conversation3
                           mov  es:[di], cl
                           add  di,2                            ; 0692H, 因为07是颜色, 所以加2
                           inc  si
                           jmp  show_conversation2
      show_conversation3:
                           pop  di
                           pop  si
                           pop  es
                           pop  ds
                           pop  cx
                           ret

      init_reg:
                           mov  bx, data
                           mov  ds,bx
                           mov  bx,0B800H
      ;    mov  bx,2000H                        ; 先用 2000H 代替显存段
                           mov  es,bx
                           ret
      clear_screen:
                           mov  bx,0
                           mov  dx,0700H                        ; 00 空字符, 07白色
      ; 显示缓冲区分为 8 页, 每页 4KB(≈4000B = 80x2x25,80 个字符 => 偶数列, 80 个颜色控制 => 奇数列)
                           mov  cx,2000
      clear_screen1:
                           mov  es:[bx],dx                      ; 用 0007H 替换2000次数据, 一页
                           add  bx,2
                           loop clear_screen1
                           ret


code ends
end start
Prev: call Next: call-综合练习2