汇编语言直接定指标的应用实验16代码
2017-02-08 15:11
561 查看
代码解释如下:
;汇编语言王爽 直接定址表 实验16
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
call cpy_newInt7ch ;复制定义的新的int7ch中断处理程序
call set_newInt7ch ;设置中断向量表
mov ah,2 ;初始化参数,执行哪个子程序
mov al,10111010B ;al存颜色参数
int 7ch ;执行7ch中断程序
mov ax,4c00h
int 21h
;========================================================= 设置新的中断程序
new_int7ch: jmp newInt7chStart
TABLE dw offset clear_screen - offset new_int7ch +7e00h ;记录每个子程序的入口地址,参数0
dw offset set_pre_screen - offset new_int7ch +7e00h ;参数1
dw offset set_back_screen - offset new_int7ch +7e00h ;参数2
dw offset set_up_scroll - offset new_int7ch +7e00h ;参数3
newInt7chStart: push bx
push es
push ax
mov bx,0
mov es,bx
mov bl,ah
add bx,bx ;存储程序地址的是双字,所以bx加倍
add bx,offset TABLE - offset new_int7ch + 7e00h
call word ptr es:[bx]
pop ax
pop es
pop bx
iret ;中断程序用iret返回
;========================================================= 清屏
clear_screen: push cx
push bx
push es
push di
mov cx,2000
mov bx,0b800h
mov es,bx
mov di,0
clearScreen: mov es:[di],0700h
add di,2
loop clearScreen
pop di
pop es
pop bx
pop cx
ret
;========================================================= 设置前景色
set_pre_screen: push cx
push bx
push es
push ax
mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
changePreColor: and byte ptr es:[bx],11111000B
or byte ptr es:[bx],al
add bx,2
loop changePreColor
pop ax
pop es
pop bx
pop cx
ret
;========================================================= 设置背景色
set_back_screen: push cx
push bx
push es
push ax
mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
changeBackColor: and byte ptr es:[bx],10001111B
or byte ptr es:[bx],al
add bx,2
loop changeBackColor
pop ax
pop es
pop bx
pop cx
ret
;========================================================= 向上滚动一行
set_up_scroll: push bx
push es
push ds
push di
push si
push cx
mov bx,0b800h
mov es,bx
mov ds,bx
mov di,0
mov si,160
mov cx,24*160
rep movsb
mov cx,80
setNull: mov di,160*24 ;设置最后一行为空
mov es:[di],0700h
add di,2
loop setNull
pop cx
pop si
pop di
pop ds
pop es
pop bx
ret
;=========================================================
new_int7chEnd: nop
;========================================================== 复制中断程序
cpy_newInt7ch: push ax
push ds
push si
push es
push di
push cx
mov ax,cs
mov ds,ax
mov si,offset new_int7ch
mov ax,0
mov es,ax
mov di,7e00h
mov cx,offset new_int7chEnd - offset new_int7ch
cld ;每次执行后si,di加 1,
rep movsb
pop cx
pop di
pop es
pop si
pop ds
pop ax
ret
;========================================================== 设置中断向量表
set_newInt7ch: mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],7e00h ;设置IP = 7e00
mov word ptr es:[7ch*4+2],0 ;设置cs = 0000
sti
ret
;==========================================================
code ends
end start
;汇编语言王爽 直接定址表 实验16
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
call cpy_newInt7ch ;复制定义的新的int7ch中断处理程序
call set_newInt7ch ;设置中断向量表
mov ah,2 ;初始化参数,执行哪个子程序
mov al,10111010B ;al存颜色参数
int 7ch ;执行7ch中断程序
mov ax,4c00h
int 21h
;========================================================= 设置新的中断程序
new_int7ch: jmp newInt7chStart
TABLE dw offset clear_screen - offset new_int7ch +7e00h ;记录每个子程序的入口地址,参数0
dw offset set_pre_screen - offset new_int7ch +7e00h ;参数1
dw offset set_back_screen - offset new_int7ch +7e00h ;参数2
dw offset set_up_scroll - offset new_int7ch +7e00h ;参数3
newInt7chStart: push bx
push es
push ax
mov bx,0
mov es,bx
mov bl,ah
add bx,bx ;存储程序地址的是双字,所以bx加倍
add bx,offset TABLE - offset new_int7ch + 7e00h
call word ptr es:[bx]
pop ax
pop es
pop bx
iret ;中断程序用iret返回
;========================================================= 清屏
clear_screen: push cx
push bx
push es
push di
mov cx,2000
mov bx,0b800h
mov es,bx
mov di,0
clearScreen: mov es:[di],0700h
add di,2
loop clearScreen
pop di
pop es
pop bx
pop cx
ret
;========================================================= 设置前景色
set_pre_screen: push cx
push bx
push es
push ax
mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
changePreColor: and byte ptr es:[bx],11111000B
or byte ptr es:[bx],al
add bx,2
loop changePreColor
pop ax
pop es
pop bx
pop cx
ret
;========================================================= 设置背景色
set_back_screen: push cx
push bx
push es
push ax
mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
changeBackColor: and byte ptr es:[bx],10001111B
or byte ptr es:[bx],al
add bx,2
loop changeBackColor
pop ax
pop es
pop bx
pop cx
ret
;========================================================= 向上滚动一行
set_up_scroll: push bx
push es
push ds
push di
push si
push cx
mov bx,0b800h
mov es,bx
mov ds,bx
mov di,0
mov si,160
mov cx,24*160
rep movsb
mov cx,80
setNull: mov di,160*24 ;设置最后一行为空
mov es:[di],0700h
add di,2
loop setNull
pop cx
pop si
pop di
pop ds
pop es
pop bx
ret
;=========================================================
new_int7chEnd: nop
;========================================================== 复制中断程序
cpy_newInt7ch: push ax
push ds
push si
push es
push di
push cx
mov ax,cs
mov ds,ax
mov si,offset new_int7ch
mov ax,0
mov es,ax
mov di,7e00h
mov cx,offset new_int7chEnd - offset new_int7ch
cld ;每次执行后si,di加 1,
rep movsb
pop cx
pop di
pop es
pop si
pop ds
pop ax
ret
;========================================================== 设置中断向量表
set_newInt7ch: mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],7e00h ;设置IP = 7e00
mov word ptr es:[7ch*4+2],0 ;设置cs = 0000
sti
ret
;==========================================================
code ends
end start
相关文章推荐
- 汇编语言笔记16-直接定址表
- 汇编语言: 实验七 寻址方式在结构化数据访问中的应用
- 8086汇编学习小记-王爽汇编语言实验16
- 汇编语言(王爽)--实验7寻址方式在结构化数据访问中的应用
- 汇编语言----实验16--编写包含多个功能子程序的中断例程
- 王爽 汇编语言第二版 实验8 代码详细分析
- 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析
- 王爽<汇编语言>实验十一 (附测试代码)
- 高级语言为什么不直接编译成机器码,而编译成汇编代码?
- ***汇编语言 实验16 编写包含多个功能子程序的中断例程
- 汇编语言 王爽 第二版 实验16
- 汇编语言 第三版 王爽 实验7 寻址方式在结构化数据访问中的应用
- 汇编语言(王爽)-实验16
- 王爽 汇编语言 实验7 寻址方式在结构化数据访问中的应用,用栈实现
- 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析
- 汇编语言(王爽第三版)实验7寻址方式在结构化数据访问中的应用
- 【汇编语言(第3版)王爽】试验7 寻址方式在接过话数据访问中的应用(代码+注释)
- 汇编语言循环遍历链表代码分析(16)
- 将对象直接转换为接口应用的代码例子, 注意其中用了 as 方式, 很有意思
- 在Symbian应用里嵌入汇编代码