代码的直接定址表(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
目录
相关文章
|
存储 SQL Java
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
624 0
MySQL存储过程手册,及创建存储过程:循环为所有表添加字段
|
1月前
|
存储 人工智能
哈希表基础(含代码演示)
哈希表基础(含代码演示)
20 0
|
4月前
|
SQL 前端开发 关系型数据库
MYSQL基础知识之【复制表】
MYSQL基础知识之【复制表】
44 1
|
5月前
|
Oracle 关系型数据库 MySQL
根据一张表更新另一张表
根据一张表更新另一张表
|
6月前
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
26 0
|
10月前
|
SQL 关系型数据库 MySQL
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
插入数据、阻止对某几列插入的实现、复制表的定义和数据以及注意事项、比创建约束功能更强大!用 WITH CHECK OPTION限制数据录入、如何一个insert将数据同时插入多个表【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。但是!ORA - 01723 : 不允许长度为 0 的列。
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
|
SQL 关系型数据库 MySQL
MySQL基础-表操作~修改数据
修改数据的具体语法为: UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
115 0
|
物联网 Shell 开发者
SQLite 补操作复制表以及修改表结构 | 学习笔记
快速学习 SQLite 补操作复制表以及修改表结构
380 0
|
存储 SQL 关系型数据库
MySQL数据库的创建(表的创建,列,表的增删改,深入浅出)
存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团乱麻,无从下手。那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。
MySQL数据库的创建(表的创建,列,表的增删改,深入浅出)