王爽 《汇编语言》 实验16 将含有直接定址表的程序,安装到中断上
2011-07-27 11:58
405 查看
昨天晚上做的。
实验16的内容是要求把16.4的程序,安装到0:200H中,
以便给 int 7cH调用。
做这个程序的时候,我没有照抄16.4,而是凭借着看过两三遍的印象,
用作者的思路把实验16完成的。
本来以为难点无非就是实现功能,把程序安装到0:200H上有啥难的?
结果我发现我错了。实现功能别说书上有例子,即使没有例子也并不困难。
难点就是直接定址表安装到0:200H处,会有许多偏移地址的问题。
比如当 table在自己所写的程序中,距离 CS的 OFFSET是 abH,
当它安装到 0:200H处,
由于偏移地址发生了变化,
调用表里面的 内容所代表的子程序,就不是 一个 TABLE[BX]这么简单了
今天活比较多,不多说了,趁打版本的时候上程序~
重点是 直接定址表的偏移,确定CS:IP
最近一直辛苦小静静乐,谢谢温柔贤惠懂事漂亮可爱的傻帽小静静,给我提供了安稳的环境。
不过得批评一下小静静,晚上老布早睡觉!
不知道我这电脑啥时候好,电脑好了陪小静静WOW呀~
实验16的内容是要求把16.4的程序,安装到0:200H中,
以便给 int 7cH调用。
做这个程序的时候,我没有照抄16.4,而是凭借着看过两三遍的印象,
用作者的思路把实验16完成的。
本来以为难点无非就是实现功能,把程序安装到0:200H上有啥难的?
结果我发现我错了。实现功能别说书上有例子,即使没有例子也并不困难。
难点就是直接定址表安装到0:200H处,会有许多偏移地址的问题。
比如当 table在自己所写的程序中,距离 CS的 OFFSET是 abH,
当它安装到 0:200H处,
由于偏移地址发生了变化,
调用表里面的 内容所代表的子程序,就不是 一个 TABLE[BX]这么简单了
今天活比较多,不多说了,趁打版本的时候上程序~
assume cs:code code segment start: mov ax,0 ; mov func to 0:200H mov es,ax mov di,200H mov ax,cs mov ds,ax mov si,offset func mov cx,offset funcend - offset func cld rep movsb mov ax,0 mov es:[7cH*4+2],ax mov ax,200H mov es:[7cH*4],ax mov ah,2 mov al,00000011B ; 0~7 ;call func ; for test int 7cH mov ax,4c00H int 21H ;------------------------------------------------ ; USING TABLE ,GOTO SUB FUNCTION ; ah:0,1,2,3 select sub function ; al:0~7 color ;------------------------------------------------ func: push bx push ss push dx push es jmp short sta table dw func1-func+200H,func2-func+200H,func3-func+200H,func4-func+200H sta: mov bl,ah mov bh,0 add bx,bx sub bx,offset func ; to adjust offset table & 0:200H add bx,200H call table[bx] pop es pop dx pop ss pop bx ;ret iret ;------------------------------------------------ ; CLEAR SCREEN ;------------------------------------------------ func1: push ax push es push si push cx mov ax,0b800H mov es,ax mov si,0 mov cx,2000 func1s: mov byte ptr es:[si],' ' add si,2 loop func1s pop cx pop si pop es pop ax ret ;------------------------------------------------ ; CHANGE BACKCOLOR ; al: color ;------------------------------------------------ func2: push ax push es push si push cx push ax mov ax,0b800H mov es,ax mov si,1 pop ax mov cl,4 shl al,cl mov cx,2000 func2s: and byte ptr es:[si],10001111B or byte ptr es:[si],al add si,2 loop func2s pop cx pop si pop es pop ax ret ;------------------------------------------------ ; CHANGE FORECOLOR ; al: color ;------------------------------------------------ func3: push ax push es push si push cx push ax mov ax,0b800H mov es,ax mov si,1 pop ax mov cx,2000 func3s: and byte ptr es:[si],11111000B or byte ptr es:[si],al add si,2 loop func3s pop cx pop si pop es pop ax ret ;------------------------------------------------ ; SCROLL UP ONE LINE ;------------------------------------------------ func4: push ax push ds push si push es push di push cx mov ax,0b800H mov ds,ax push ds pop es mov si,160 ; line 2-->line 1 mov di,0 mov cx,24 fn4s3: push cx mov cx,80 func4s: mov al,ds:[si] mov es:[di],al add si,2 add di,2 loop func4s pop cx loop fn4s3 mov si,160*24 mov cx,80 func4s2: mov byte ptr es:[si],' ' add si,2 loop func4s2 pop cx pop di pop es pop si pop ds pop ax ret funcend: nop code ends end start
重点是 直接定址表的偏移,确定CS:IP
最近一直辛苦小静静乐,谢谢温柔贤惠懂事漂亮可爱的傻帽小静静,给我提供了安稳的环境。
不过得批评一下小静静,晚上老布早睡觉!
不知道我这电脑啥时候好,电脑好了陪小静静WOW呀~
相关文章推荐
- 王爽《汇编语言》实验15:安装新的int 9中断例程 解答
- 王爽《汇编语言》实验12——编写0号中断的处理程序
- 王爽《汇编语言》实验16:包含多个功能子程序的中断例程 解答
- 王爽《汇编语言》实验12:编写0号中断的处理程序 解答
- 王爽《汇编语言》实验15——安装新的INT 9中断例程
- 王爽《汇编语言》第十二章实验——0号中断处理程序
- 王爽《汇编语言》实验12 编写0号中断的处理程序
- 王爽《汇编语言》实验16——编写包含多个功能子程序的中断例程
- 王爽《汇编语言》实验15 安装新的int 9中断例程
- 王爽《汇编语言》实验17——编写包含多个功能子程序的中断例程
- 王爽 汇编语言 第三版 实验15 安装新的int 9中断例程
- 汇编“生活”(一)——王爽《汇编语言》实验7程序代码
- 王爽《汇编语言》实验16
- 王爽 汇编语言 第三版 实验12 编写0号中断的处理程序
- 王爽《汇编语言》第9章 实验8 分析一个奇怪的程序
- 王爽《汇编语言》实验13:编写、应用中断例程 - 打印字符串 解答
- 王爽 汇编 实验16 增加键盘中断调用int 7ch中断例程
- 王爽《汇编语言》实验13——编写、应用中断例程
- 王爽 汇编 实验15:安装新的int9中断例程
- 汇编语言(王爽)--实验13编写,应用中断历程