鱼C论坛

 找回密码
 立即注册
查看: 5323|回复: 19

[汇编作业] Assembly language 实验16

[复制链接]
发表于 2013-8-5 22:18:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

实验16


63d0f703918fa0ec47408aad269759ee3c6d55fbb3fbe3b7.jpg

这个实验比较有趣,光看书写出来的程序总是运行不正确
不断调试后才发现原来是在偏移地址的计算中出现了错误
以下情况是在代码中int 7ch中断例程放在start前讨论的,至于为什么要写在前面,之后说明
table dw sub1, sub2, sub3, sub4
这里面sub1,sub2等等的偏移地址在未安装前是相对于代码段即code而言的
因为编译时程序的偏移地址已经计算好放在table表中,这里JMP指令占3个字节,table占8个字节,所以sub1的偏移地址为000BH,安装后物理地址为0020BH
如果在安装程序时继续将中断向量表设置为0000H:0200H
那么问题出来了,假设输入0,table的段地址默认是cs,偏移地址是3,在call word ptr table[bx]时,(table[bx])的实际值,3+0=3,则最终转移的物理地址是(0000H:0003H)=?,显然这和预期中的物理地址(0000H:0203H)=0020BH差得太远
所以在设置中断向量表时,应该设成0020H:0000H,这样在计算转移地址时算出来的值是(0020H:0003H),和(0000H:0203H)一样
相信看到这里也就明了了为什么要把中断例程放在start前面,因为容易计算偏移地址来设置中断向量表

assume cs:code, ss:stack
; ****************************************
; 堆栈段
stack segment
    db 128 dup(0)
stack ends
; ****************************************

; ****************************************
; 代码段
code segment
; **************************************************
; 新int 7ch中断例程:
; (1) 清屏
; (2) 设置前景色
; (3) 设置背景色
; (4) 向上滚动一行
; 入口参数:
; (1) ah寄存器传递功能号:0清屏,1设置前景色,2设置背景色,3向上滚动一行
; (2) 对于2、3功能,用al传送颜色值,(al)∈{0, 1, 2, 4, 5, 6, 7}
int7ch:
    jmp set
    table dw sub1, sub2, sub3, sub4    ; 功能子程序表

; ****************************************
; 子程序sub1:
; 清屏
sub1:
    push cx
    push di
    push es
     
    mov di, 0b800h
    mov es, di
    mov di, 0          ; es:di指向显示区字符
    mov cx, 2000       ; 一屏可显示2000个字符
sub1s:
    mov byte ptr es:[di], ' '
    add di, 2
    loop sub1s
     
    pop es
    pop di
    pop cx
    ret
; ****************************************

; ****************************************
; 子程序sub2:
; 设置前景色
sub2:
    push cx
    push di
    push es
     
    mov di, 0b800h
    mov es, di
    mov di, 1                         ; es:di指向显示区字符属性
    mov cx, 2000                      ; 一屏有2000个字符
sub2s:
    and byte ptr es:[di], 11111000b   ; 前景色属性为0,1,2位
    or es:[di], al
    add di, 2
    loop sub2s
     
    pop es
    pop di
    pop cx
    ret
; ****************************************

; ****************************************
; 子程序sub3:
; 设置背景色
sub3:
    push cx
    push di
    push es
     
    mov di, 0b800h
    mov es, di
    mov di, 1                         ; es:di指向显示区字符属性
    mov cl, 4
    shl al, cl
    mov cx, 2000                      ; 一屏有2000个字符
sub3s:
    and byte ptr es:[di], 10001111b   ; 背景色属性为4,5,6位
    or es:[di], al
    add di, 2
    loop sub3s
     
    pop es
    pop di
    pop cx
    ret
; ****************************************

; ****************************************
; 子程序sub4:
; 向上滚动一行
sub4:
    push cx
    push ds
    push si
    push es
    push di
     
    mov si, 0b800h
    mov ds, si
    mov es, 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                       ; 一行有160个字节
    rep movsb
    pop cx
    loop sub4s
     
    pop di
    pop es
    pop si
    pop ds
    pop cx
    ret
; ****************************************
     
set:
    push bx
     
    mov bl, ah
    mov bh, 0
    add bx, bx        ; 根据功能号计算对应子程序在table表中的偏移
    call word ptr table[bx]
     
    pop bx
    iret

int7chend:
    nop
; **************************************************

start:
    mov ax, stack
    mov ss, ax
    mov sp, 128                              ; ss:sp指向堆栈段
     
    push cs
    pop ds
    mov si, offset int7ch                    ; ds:si指向源地址
    mov ax, 0
    mov es, ax
    mov di, 200H                             ; es:di指向目标地址
    mov cx, offset int7chend-offset int7ch   ; 传输长度
    cld                                      ; 传输方向为正
    rep movsb                                ; 安装中断向量
     
    mov word ptr es:[7ch*4], 0               ; 设置中断向量表
    mov word ptr es:[7ch*4+2], 20H           ; 20H:0为相对中断入口偏移
     
    mov ah, 1             ; 选择功能
    int 21h
    sub al, 30h           ; ASCII转换成数字
    mov ah, al
    cmp ah, 3
    ja exit               ; 大于3则结束
    je setscreen          ; 等于3则执行中断
    cmp ah, 0
    je setscreen          ; 等于0则执行中断
    mov bh, ah            ; 暂时保存功能号
    mov ah, 1             ; 输入颜色
    int 21h
    mov ah, bh            ; 还原功能号
    sub al, 30h           ; ASCII转换成数字
    cmp al, 7
    ja exit               ; 大于7则结束
     
setscreen:
    int 7ch
     
exit:
    mov ax, 4c00h
    int 21h
code ends
end start
; ****************************************





游客,如果您要查看本帖隐藏内容请回复


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-19 13:08:49 | 显示全部楼层
{:2_31:}一楼我的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-10 22:10:15 | 显示全部楼层
:handshake3Q..........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-10 22:53:17 | 显示全部楼层
看看最后写什么了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-2 19:05:11 | 显示全部楼层
直接定指标 王爽的书讲得不完善,坛主也不具体运行一下,唉!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-2 20:17:07 | 显示全部楼层
楼主真给力啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-2 20:47:06 | 显示全部楼层
看看最后写什么了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-7 22:21:56 | 显示全部楼层
3Q3Q..........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-11 07:31:32 | 显示全部楼层
谢谢分享!!!!!!!!!!!!!1{:2_35:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-2 15:19:14 | 显示全部楼层
学习了,我调试了一上午都没弄好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-3 12:07:03 | 显示全部楼层
看看隐藏的是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-3 12:07:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-3 12:58:22 | 显示全部楼层
这时候一般我们应该回复一下,以表示礼貌
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-9 22:10:41 | 显示全部楼层
看看,学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-4 12:45:26 | 显示全部楼层
还是有一些不清楚,再研究下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-24 21:35:56 | 显示全部楼层
楼主解释很棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 13:35:11 | 显示全部楼层
路过愁一愁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-7 18:04:28 | 显示全部楼层
感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-9 14:04:03 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-27 12:32:10 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 07:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表