汇编子程序

窗口指定位置显示字符串

(在窗口指定位置,用指定格式,字符串以0结束)
1.窗口显示:B8000h~BFFFFh,共25行,每行80个字即160个字节
2.字的属性:8位–>闪烁 R G B(背景) 高亮 R G B(前景)
3.B800::0000 第一行
00~01第1列 02~03第二列
B800:00A0 第二行

在窗口的83列,用绿色,显示data段中的字符串
assume cs:code
data segment
  db 'hello',0
data ends

code segment
start:mov dh,8         //8行
      mov dl,3         //3列
      mov cl,2         //绿色
      mov ax,data
      mov ds,ax
      mov si,0         //用于取数据段中的字母
      mov di,0         //用于窗口显示数据
      call show_str

      mov ax,4c00h
      int 21h

show_str:push ax    //保存主程序的寄存器
         push cx
         push dx
         push es
         push si
         push di

         mov ax,0b800h       //es保存段地址
         mov es,ax

         dec dh              //计算行:(行数-1)* 160
         mov al,160
         mul dh
         mov bx,ax           

         dec dl              //计算列:(列数-1)* 2
         add dl,dl
         add bl,dl           //bx保存偏移地址,注意用bl进行转化

         mov al,cl           //ax保存字的属性

s:mov cl,ds:[si]    //取ASCII码,记得转化
  mov ch,0
  jcxz ok
  mov es:[bx+di],cl
  mov es:[bx+di+1],al
  inc si
  add di,2
  jmp short s

ok:pop di           //恢复主程序的寄存器
   pop si
   pop es
   pop dx
   pop cx
   pop ax
   ret

code ends
end start

在窗口中间显示年/月/日 时:分:秒

在CMOS RAM中,存放当前时间:秒0(存放单元) 分2 时4 日7 月8 年9,每个信息1个字节,用BCD码表示,高四位表示十位,低四位表示个位
CMOS中有两个端口:70为地址端口,写入要访问的单元;71为数据端口,读写数据

assume cs:code

data segment
  db '00/00/00 00:00:00'
  db 9,8,7,4,2,0
data ends

code segment
start:mov ax,data
      mov ds,ax
      mov di,0     //di用来写入数据
      mov si,17     //si用来读取数据

      //读取年月日等信息,写入数据段
      mov cx,6
    s:mov al,ds:[si]     //读取数据
      out 70h,al
      in al,71h

      mov ah,al
      mov cl,4(注意:右移几位只能用cl传)
      shr ah,cl       //取得十位
      and al,00001111b     //取得个位

      add ah,30h      //BCD码+30h=十进制数
      add al,30h

      mov ds:[di],ah
      mov ds:[di+1],al

      inc si
      add di,3
      loop s

      //把数据段中的年月日,显示在屏幕上
      mov cx,17
      mov ax,data
      mov ds,ax
      mov di,0
      mov si,0

      mov bx,0b800h
      mov es,bx
   s0:mov al,ds:[di]
      mov byte ptr es:[160*12+40*2+si],al
      inc di
      add si,2
      loop s0
  mov ax,4c00h
  int 21h

code ends
end start

计算除法(商>8位时不会溢出)

X:被除数(32位),高16位是H(用dx保存),低16位是L(用ax保存)
N:除数(16位)(用cx保存)
结果:dx存高16位,ax存低16位,cx存余数
公式:X/N = int(H/N)*65536 + [rem(H/N)*65536+L]/N(int是取商,rem是取余)

计算1000000/10(F4240H/0AH)
code segment
   mov ax,4240h    //被除数低位
   mov dx,000fh    //被除数高位
   mov cx,0ah      //除数
   call divdw

   mov ax,4c00h
   int 21h

divdw:push ax      //保存低位

      mov ax,dx    //被除数高16位除以除数,商是最后结果的高16mov dx,0
      div cx      (此时rem在dx,int在ax)

      pop bx       //取出被除数的低16位,放在高位寄存器,就相当于*65536即左移16push ax      //保存最后结果的高16mov ax,bx    (相当于+L)
      div cx       //得到最后结果的低16位,存入ax

      mov cx,dx    //把余数给cx
      pop dx
      ret

code ends
end 

菜单

setscreen: jmp short set
     table dw sub1,sub2,sub3,sub4  //table为数据标号,标记了地址和单元长度
   set:push bx
       cmp ah,3    //判断功能号是否大于3
       ja sret
       mov bl ah
       mov bh,0
       add bx,bx    //ah中功能号*2=子程序在table中的偏移

       call word ptr table[bx]   //调用对应的子程序
   sret:pop bx
        ret
   ...
   sub1:...
        ...
   sub2:...
        ...
   sub3:...
        ... 
   sub4:...
        ...               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值