代码的直接定址表(1604)

简介: 本文为《汇编语言程序设计》1604小节例程。点击链接…进课程主页。任务:编程实现一个子程序setscreen,为显示输出提供如下功能: (1) 清屏。

本文为《汇编语言程序设计》1604小节例程。点击链接…进课程主页。

任务:编程实现一个子程序setscreen,为显示输出提供如下功能:
(1) 清屏。
(2) 设置前景色。
(3) 设置背景色。
(4) 向上滚动一行。

assume cs:code
code segment
start:
    mov ah, 3
    mov al, 5
    call setscreen
    mov ax, 4c00h
    int 21h

setscreen:
    jmp short set
    table  dw sub1,sub2,sub3,sub4
set:
    push bx
    cmp ah,3        ;判断传递的是否大于 3
    ja sret
    mov bl,ah
    mov bh,0
    add bx,bx       ;根据ah中的功能号计算对应子程序的地址在table表中的偏移
    call word ptr table[bx] ;调用对应的功能子程序
sret:
    pop bx
    ret

;功能子程序入口参数说明:
;(1) 用 ah 寄存器传递功能号:0 表示清屏,1表示设置前景色,2 表示设置背景色,3 表示向上滚动一行;
;(2) 对于2、3号功能,用 al 传送颜色值,(al) ∈{0,1,2,3,4,5,6,7}

;功能子程序1:清屏
sub1:
    push bx
    push cx
    push es
    mov bx,0b800h
    mov es,bx
    mov bx,0
    mov cx,2000
sub1s:
    mov byte ptr es:[bx],' '
    add bx,2
    loop sub1s
    pop es
    pop cx
    pop bx
    ret ;sub1 ends

;功能子程序2:设置前景色
sub2:
    push bx
    push cx
    push es
    mov bx,0b800h
    mov es,bx
    mov bx,1
    mov cx,2000
sub2s:
    and byte ptr es:[bx],11111000b
    or es:[bx],al
    add bx,2
    loop sub2s

    pop es
    pop cx
    pop bx
    ret ;sub2 ends

;功能子程序3:设置背景色
sub3:
    push bx
    push cx
    push es
    mov cl,4
    shl al,cl
    mov bx,0b800h
    mov es,bx
    mov bx,1
    mov cx,2000
sub3s:
    and byte ptr es:[bx],10001111b
    or es:[bx],al
    add bx,2
    loop sub2s

    pop es
    pop cx
    pop bx
    ret ; sub3 ends

;功能子程序4:向上滚动一行
sub4:
    push cx
    push si
    push di
    push es
    push ds

    mov si,0b800h
    mov es,si
    mov ds,si
    mov si,160        ;ds:si指向第n+1行
    mov di,0        ;es:di指向第n行
    cld
    mov cx,24;共复制24行

sub4s:
    push cx
    mov cx,160
    rep movsb         ;复制
    pop cx
    loop sub4s

    mov cx,80
    mov si,0
sub4s1:
    mov byte ptr es:[160*24+si],' '    ;最后一行清空
    add si,2
    loop sub4s1

    pop ds
    pop es
    pop di
    pop si
    pop cx
    ret ;sub4 ends

code ends
end start
目录
相关文章
|
Oracle 关系型数据库 MySQL
根据一张表更新另一张表
根据一张表更新另一张表
|
关系型数据库 MySQL 数据库
重命名表,应该怎么做?
有时候我们会遇到重命名表的需求,比如说因业务变化,需要将表 a 重命名为表 b 。这个时候可以执行 RENAME TABLE 语句或 ALTER TABLE 语句来重命名表。本篇文章我们一起来学习下重命名表相关知识。
350 0
|
SQL 关系型数据库 MySQL
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
插入数据、阻止对某几列插入的实现、复制表的定义和数据以及注意事项、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入、如何一个insert将数据同时插入多个表【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。但是!ORA - 01723 : 不允许长度为 0 的列。
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
|
存储 SQL 关系型数据库
MySQL数据库的创建(表的创建,列,表的增删改,深入浅出)
存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团乱麻,无从下手。那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。
MySQL数据库的创建(表的创建,列,表的增删改,深入浅出)
|
物联网 Shell 开发者
SQLite 补操作复制表以及修改表结构 | 学习笔记
快速学习 SQLite 补操作复制表以及修改表结构
|
数据库 索引
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
设计数据库唯一索引时,经常会碰到唯一删除的键值,导致很难处理,这里就简单介绍一种巧办法,帮你快速解决该问题
2003 0
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
|
存储
基于存储过程实现批量复制表(Procedure)的方案实现
基于存储过程实现批量复制表(Procedure)的方案实现
618 0
|
索引
慎用SELECT INTO复制表
原文:慎用SELECT INTO复制表 很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆人一样,只是得到了一个躯体,个人的意识、回忆都不会克隆的。
760 0
下一篇
DataWorks