汇编网首页登录博客注册
gyk1983的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
友情链接

[2008-12-15 21:17] 试验16

以为自己掌握差不多了,结果被绝对地址和相对位移整糊涂了。
看了论坛里牛人做的程序,还是有点不明白,思考了一天啊,最后终于明白了。
感到非常沮丧,我咋这么笨呢!!

废话少说,赶快把自己的理解记下来才是王道。
首先,绝对地址是在编译器编译的时候确定的,就是标号在当前段中的偏移。它是绝对的,因为编译器就编译一次。
相对位移,就是两个标号地址的差的绝对值。

当把一段程序拷贝到另一块内存中,程序中标号代表的数值不变,还是在原程序中相对代码段开始位置的偏移量。
所以在中断例程中调用子程序时,一定要保证子程序的地址正确。
若把中断处理程序写在0:200开始的内存单元,进入中断后cs=...
阅读全文 | 评论次数(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)保存原...
阅读全文 | 评论次数(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:...
阅读全文 | 评论次数(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...
阅读全文 | 评论次数(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 ...
阅读全文 | 评论次数(1) | 浏览次数(766) | 所属类型(汇编作业)

[2008-12-09 15:00] 第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 ...
阅读全文 | 评论次数(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...
阅读全文 | 评论次数(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      ' ...
阅读全文 | 评论次数(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...
阅读全文 | 评论次数(2) | 浏览次数(790) | 所属类型(汇编作业)
『 查看更多文章 』