以为自己掌握差不多了,结果被绝对地址和相对位移整糊涂了。
看了论坛里牛人做的程序,还是有点不明白,思考了一天啊,最后终于明白了。
感到非常沮丧,我咋这么笨呢!!
废话少说,赶快把自己的理解记下来才是王道。
首先,绝对地址是在编译器编译的时候确定的,就是标号在当前段中的偏移。它是绝对的,因为编译器就编译一次。
相对位移,就是两个标号地址的差的绝对值。
当把一段程序拷贝到另一块内存中,程序中标号代表的数值不变,还是在原程序中相对代码段开始位置的偏移量。
所以在中断例程中调用子程序时,一定要保证子程序的地址正确。
若把中断处理程序写在0:200开始的内存单元,进入中断后cs=...
- [martian] 恭喜博主对实验的进一步理解,但建议博主自己实现一次。 12/26 19:34
- [mess] 过了课设一,后面的程序相对都比较简单了,书上的代码很多 :-) 12/15 17:03
- [deepblue] 赞! 12/13 22:28
- [wsrf] 程序没有问题。 12/12 11:05
- [游客] 说明:为了显示结果,调用第10章的显示字符串程序,在屏幕上显示了转换后的结果,这样比较帅,也比较能满 12/10 20:26
- [younggay] 不错,尤其是前面的描述很有意思。 努力。 12/09 15:02
- [游客] 厉害! 12/07 15:16
- [starrynight] 帅就一个字!!! 继续加油学哦!!! 12/06 12:24
- [mess] 主要明白pop 和 push的操作步骤,sp的变化,这个题就比较简单了~ 12/05 14:12
- [mess] 用栈保存和传递参数是不错的方法,反汇编c程序也能发现这一点~ 12/05 14:10
[2008-12-15 21:17] 试验16
阅读全文 |
评论次数(1) |
浏览次数(838) |
所属类型(汇编作业)
[2008-12-14 16:06] 试验15
用http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=3362&kindLevel=1&kindId=2012&postId=15097
上面说的virtual pc做试验环境,效果真不错。
把编好的exe文件放到虚拟软驱里,在virtual pc的dos下执行就看到效果了,很好的工具,谢谢提供工具的好心人。
总结下搞中断程序的基本步骤:
(1)编写我们自己功能的ourproc
(2)把ourproc拷贝到一块内存区域,一般是(0:200-0:300)之间,这样保证安装程序退出后,中断程序仍然有效。
(3)保存原...
上面说的virtual pc做试验环境,效果真不错。
把编好的exe文件放到虚拟软驱里,在virtual pc的dos下执行就看到效果了,很好的工具,谢谢提供工具的好心人。
总结下搞中断程序的基本步骤:
(1)编写我们自己功能的ourproc
(2)把ourproc拷贝到一块内存区域,一般是(0:200-0:300)之间,这样保证安装程序退出后,中断程序仍然有效。
(3)保存原...
阅读全文 |
评论次数(1) |
浏览次数(822) |
所属类型(汇编作业)
[2008-12-13 21:44] 实验14 访问CMOS RAM
本章基本就是材料阅读,没有什么技术含量。
这里把处理BCD 码的部分写成个子程序。
知识点:
COMS端口有70h和71h,70h存放地址,71h存放数据。
读端口(读2单元):
mov al,2
out 70h,al
in al,71h
写端口(向2单元写个0):
mov al,2
out 70h,al
mov al,0
out 71h,al
此外还学习了shl和shr两个逻辑移位指令。
代码如下:
assume cs:code
code segment
start:...
这里把处理BCD 码的部分写成个子程序。
知识点:
COMS端口有70h和71h,70h存放地址,71h存放数据。
读端口(读2单元):
mov al,2
out 70h,al
in al,71h
写端口(向2单元写个0):
mov al,2
out 70h,al
mov al,0
out 71h,al
此外还学习了shl和shr两个逻辑移位指令。
代码如下:
assume cs:code
code segment
start:...
阅读全文 |
评论次数(1) |
浏览次数(817) |
所属类型(汇编作业)
[2008-12-11 20:11] 试验12
由于是在虚拟8086下运行程序,所以在同一个命令提示符窗口内中断会起作用,先运行安装中断程序,用debug -a敲入
mov ax,1000
mov bl,1
div bl
然后-t执行,执行完div指令就会在屏幕中间显示divide error!
为了简化测试过程,直接在安装中断的程序内部测试,即运行完程序直接显示divide error!
中断处理过程就是保存现场,处理中断,返回现场。
其中在保存现场和处理中断之间发生了些不为人知的事情,就是根据中断源查找中断向量表,确定中断程序入口地址。
中断向量表的空间是0000:0000-0000:03E8,其中0000:0...
mov ax,1000
mov bl,1
div bl
然后-t执行,执行完div指令就会在屏幕中间显示divide error!
为了简化测试过程,直接在安装中断的程序内部测试,即运行完程序直接显示divide error!
中断处理过程就是保存现场,处理中断,返回现场。
其中在保存现场和处理中断之间发生了些不为人知的事情,就是根据中断源查找中断向量表,确定中断程序入口地址。
中断向量表的空间是0000:0000-0000:03E8,其中0000:0...
阅读全文 |
评论次数(1) |
浏览次数(771) |
所属类型(汇编作业)
[2008-12-10 19:38] 实验11
关键点:(1)除小写字母外的字符保持原样
(2)采用and 11011111b的方法把小写转换为大写
(3)跳转指令和cmp的结合使用
说明:为了显示结果,调用第10章的显示字符串程序,在屏幕上显示了转换后的结果,这样比较帅,也比较能满足我的审美情趣和虚荣心,也比较画蛇添足。
代码如下:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin:mov ...
(2)采用and 11011111b的方法把小写转换为大写
(3)跳转指令和cmp的结合使用
说明:为了显示结果,调用第10章的显示字符串程序,在屏幕上显示了转换后的结果,这样比较帅,也比较能满足我的审美情趣和虚荣心,也比较画蛇添足。
代码如下:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin:mov ...
阅读全文 |
评论次数(1) |
浏览次数(766) |
所属类型(汇编作业)
[2008-12-09 15:00] 第10章 课程设计
总体上来说,就是实现三个子程序,然后拼接起来。
遇到的问题和解决的办法:
第一个子程序:处理除法商溢出的问题
理论证明比较麻烦,可按照理论去操作一点都不难,看来搞技术的确实没什么技术含量,真正牛的人是搞数学理论的。
第二个子程序:显示数据段某个位置的存放的字符串
单个子程序测试没问题,可拿到大程序里调用却出现多个bug,最后发现是没有保存用到栈,结果影响了外部程序。
第三个子程序:把数字转为字符存放到数据段某个位置
按除以10取余数的方法,依次取到的余数构成的字符串刚好和原数字方向相反,想想怎么解决呢?哈哈,栈!没错就是它。可每次压栈的是两个字节,余数对应的字符是一个字节...
遇到的问题和解决的办法:
第一个子程序:处理除法商溢出的问题
理论证明比较麻烦,可按照理论去操作一点都不难,看来搞技术的确实没什么技术含量,真正牛的人是搞数学理论的。
第二个子程序:显示数据段某个位置的存放的字符串
单个子程序测试没问题,可拿到大程序里调用却出现多个bug,最后发现是没有保存用到栈,结果影响了外部程序。
第三个子程序:把数字转为字符存放到数据段某个位置
按除以10取余数的方法,依次取到的余数构成的字符串刚好和原数字方向相反,想想怎么解决呢?哈哈,栈!没错就是它。可每次压栈的是两个字节,余数对应的字符是一个字节...
阅读全文 |
评论次数(1) |
浏览次数(828) |
所属类型(汇编作业)
[2008-12-06 10:20] 试验9
思路:两层循环,一层控制颜色属性和显示位置,二层负责输出welcom to masm!。其中在ah放颜色属性,在al放字符。用栈保存CX(外层循环和内层循环计数器隔离)和si(颜色属性在数据段中的位置),因为内层用si表示字符位置偏移。
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 3 dup(0)
stack ends
assume cs:codesg,ds:data,ss:stack
codesg segment
start:mov ax,data ...
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 3 dup(0)
stack ends
assume cs:codesg,ds:data,ss:stack
codesg segment
start:mov ax,data ...
阅读全文 |
评论次数(2) |
浏览次数(850) |
所属类型(汇编作业)
[2008-12-04 18:47] 试验7
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,11...
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,11...
阅读全文 |
评论次数(1) |
浏览次数(534) |
所属类型(汇编作业)
[2008-12-04 13:15] 第七章 问题7.9
让每个单词的前四个字母变为大写
思路:该问题是一个4*4的两重循环问题,对外层循环的CX压栈使得内层循环的CX不影响外层,注意两次循环的标号位置,还有寻址方式为ds:[bx+si+3],外层循环每次bx+16,内层每次si+1。
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace ' ...
思路:该问题是一个4*4的两重循环问题,对外层循环的CX压栈使得内层循环的CX不影响外层,注意两次循环的标号位置,还有寻址方式为ds:[bx+si+3],外层循环每次bx+16,内层每次si+1。
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace ' ...
阅读全文 |
评论次数(1) |
浏览次数(779) |
所属类型(汇编作业)
[2008-12-02 16:18] 检测点3.2
(1)
mov ax,2000H
mov ss,ax
mov sp,0010H
(2)
mov ax,1000H
mov ss,ax
mov sp,0H...
mov ax,2000H
mov ss,ax
mov sp,0010H
(2)
mov ax,1000H
mov ss,ax
mov sp,0H...
阅读全文 |
评论次数(2) |
浏览次数(790) |
所属类型(汇编作业)
『 查看更多文章 』