整体思路:没一次循环将年份,收入,人数复制到table中正确位置的同时,将收入赋值给ax,dx,然后进行除法计算求出人均收入,然后将结果(保存在ax中)复制到table中的正确位置,整个程序只进行一次循环
具体细节
因为整个程序进行一次循环,需考虑好各个寄存器分别保存什么样的值
我的想法是
ds:数据段data的段地址,bx为便宜地址
则年份、收入、人数的偏移地址分别为[bx]+0、[bx]+84、[bx]+168
因为年份、收入均为4个字节,人数为一个字节,分别用di,si来计算每个年份的偏移地址
ss:保存table的段地址
bp:保存每个年份的偏移地址
每年的年份、...


- [hncscwc] 呵呵,确实考虑不周,学习了 06/08 19:10
- [游客] 很好!!不过,建议不要轻易的使用ss段地址,因为这是栈公用的,小心出问题,如果是对普通概念的内存操作 06/08 11:00
- [hncscwc] 谢谢支持,大家一起加油 12/11 23:41
- [游客] 要顶博主! 12/11 19:40
- [musicvs] /************************************** [ hncscw 12/11 16:13
- [hncscwc] 我要能有我们经理一半的水平就非常不错了,呵呵 12/11 12:41
- [yugong] 说的很神呢!自己还没有这样的感觉 12/09 20:27
- [mess] 欢迎回来:-) 11/28 14:00
- [w0922] 刚操作失误····可以看见···· 在dos 下可以看见···· windows 下为 05/12 15:50
- [w0922] 博主运行那看那滴不····程序好像没错 可显示不出来·· 05/12 15:41
[2009-06-06 17:35] 再做实验7
阅读全文 |
评论次数(2) |
浏览次数(846) |
所属类型(程序实验)
[2008-05-12 09:07] 实验14
本人觉得这个程序写得比较糟糕,不能用循环指令来控制,有很多重复得代码,还请指教好的方法
assume cs:code
code segment
start: mov al,9 ;处理显示年
out 70H,al
in al,71H
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B
add ah,30H
add al,30H
mov bx,0B800H
mov es,bx
mov byte ptr es:[160*12+24*2],ah
mov byte ptr es:[160...
assume cs:code
code segment
start: mov al,9 ;处理显示年
out 70H,al
in al,71H
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B
add ah,30H
add al,30H
mov bx,0B800H
mov es,bx
mov byte ptr es:[160*12+24*2],ah
mov byte ptr es:[160...
阅读全文 |
评论次数(4) |
浏览次数(1011) |
所属类型(程序实验)
[2008-05-12 09:03] 实验13(3)
关键:各个字符串和行数的地址
assume cs:code
code segment
s1:db 'Good,better,best,','$'
s2:db 'Never let it rest,','$'
s3:db 'Till good is better,','$'
s4:db 'And better best.','$'
s: dw offset s1,offset s2,offset s3,offset s4
row:db 2,4,6,8
start: mov ax,cs
mov ds,ax
mov bx,offset s ;ds:(bx)...
assume cs:code
code segment
s1:db 'Good,better,best,','$'
s2:db 'Never let it rest,','$'
s3:db 'Till good is better,','$'
s4:db 'And better best.','$'
s: dw offset s1,offset s2,offset s3,offset s4
row:db 2,4,6,8
start: mov ax,cs
mov ds,ax
mov bx,offset s ;ds:(bx)...
阅读全文 |
评论次数(1) |
浏览次数(849) |
所属类型(程序实验)
[2008-05-12 08:55] 实验13(2)
本题考查中断程序处理循环的控制
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset lp ;ds:si中断程序地址
mov ax,0
mov es,ax
mov di,200H ;es:di存储中断程序的地址
cld
rep movsb ;复制中断程序
mov ax,0
mov es,ax
mov word ptr es:[7CH*4+0],200H
mov word ptr es:[7CH*4+2],0 ;设置中断向量表
...
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset lp ;ds:si中断程序地址
mov ax,0
mov es,ax
mov di,200H ;es:di存储中断程序的地址
cld
rep movsb ;复制中断程序
mov ax,0
mov es,ax
mov word ptr es:[7CH*4+0],200H
mov word ptr es:[7CH*4+2],0 ;设置中断向量表
...
阅读全文 |
评论次数(1) |
浏览次数(723) |
所属类型(程序实验)
[2008-05-12 08:51] 实验13(1)
和检测点13.1还有书本上的例子基本类似,熟悉指令iret,int
assume cs:code
data segment
db "Welcome to masm!",0
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si,offset show
mov ax,0
mov es,ax
mov di,200H
mov cx,offset showend-offset show
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:...
assume cs:code
data segment
db "Welcome to masm!",0
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si,offset show
mov ax,0
mov es,ax
mov di,200H
mov cx,offset showend-offset show
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:...
阅读全文 |
评论次数(1) |
浏览次数(813) |
所属类型(程序实验)
[2008-05-06 09:06] 试验12
思路:
(1)将中断处理程序复制到正确的位置(复制到从0000:0200开始处)
(2)设置中断向量表项中的值,使它指向中断处理程序的地址
(3)编写中断处理程序显示字符串"divide error"
源程序:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset d0 ;ds:si源程序地址
mov ax,0
mov es,ax
mov di,200H ;es:di中断处理程序的地址
mov cx,offset d0end-offset d0;中断程序的长度
...
(1)将中断处理程序复制到正确的位置(复制到从0000:0200开始处)
(2)设置中断向量表项中的值,使它指向中断处理程序的地址
(3)编写中断处理程序显示字符串"divide error"
源程序:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset d0 ;ds:si源程序地址
mov ax,0
mov es,ax
mov di,200H ;es:di中断处理程序的地址
mov cx,offset d0end-offset d0;中断程序的长度
...
阅读全文 |
评论次数(4) |
浏览次数(1042) |
所属类型(程序实验)
[2008-05-03 16:20] 实验11
letterc子程序流程:
(1)将ds:[si]中值赋给cl,判断是否为字符串的末尾(以0结束),利用jcxz跳转
(2)判断字符是否是小写字母,小写字母的范围:[97,122],用cmp命令设置标志寄存器的值,用jb,ja指令
跳转,即小于97跳转到下一字符处,大于122也跳转到下一个字符处
(3)若字符确实为小写字符,即对字符进行转变,字符的值保存在cl中,又小写字母与大写字母相差32,故
对cl执行减32操作,然后再保存再ds:[si]中即可
assume cs:codesg
datasg segment
db "Beginner's All-purp...
(1)将ds:[si]中值赋给cl,判断是否为字符串的末尾(以0结束),利用jcxz跳转
(2)判断字符是否是小写字母,小写字母的范围:[97,122],用cmp命令设置标志寄存器的值,用jb,ja指令
跳转,即小于97跳转到下一字符处,大于122也跳转到下一个字符处
(3)若字符确实为小写字符,即对字符进行转变,字符的值保存在cl中,又小写字母与大写字母相差32,故
对cl执行减32操作,然后再保存再ds:[si]中即可
assume cs:codesg
datasg segment
db "Beginner's All-purp...
阅读全文 |
评论次数(1) |
浏览次数(734) |
所属类型(程序实验)
[2008-04-16 08:29] 实验10(3)
对于这个实验要解决的问题有:
(1)求得每位数字: 用书中的方法可得到每一位上的数字,但是在进行除法时要考虑到溢出的问题,这可以用除法溢出的子程序,另外用书中方法是要考虑商是否为0,除法子程序将商保存在dx(高16位)和ax(低16位)中,故用jcxz对商判断并进行跳转时需要对dx,ax都进行断,即只有DX和AX中的值均为0时才认为已经取到了数据每位的值
(2)将数字存储在正确的位置:我们除法的方法求得的数字是从低位到高位的,以12666为例,现得到个位6,再得到十位数字6...最后得到万位数字1,但是我们在存储的时候是按1,2,6,6,6的顺序存储的,这里我想了一些方法,如使用栈先存...
(1)求得每位数字: 用书中的方法可得到每一位上的数字,但是在进行除法时要考虑到溢出的问题,这可以用除法溢出的子程序,另外用书中方法是要考虑商是否为0,除法子程序将商保存在dx(高16位)和ax(低16位)中,故用jcxz对商判断并进行跳转时需要对dx,ax都进行断,即只有DX和AX中的值均为0时才认为已经取到了数据每位的值
(2)将数字存储在正确的位置:我们除法的方法求得的数字是从低位到高位的,以12666为例,现得到个位6,再得到十位数字6...最后得到万位数字1,但是我们在存储的时候是按1,2,6,6,6的顺序存储的,这里我想了一些方法,如使用栈先存...
阅读全文 |
评论次数(5) |
浏览次数(407) |
所属类型(程序实验)
[2008-04-12 09:46]
实验10(1)显示字符串
根据题意认为这个实验实现时的两个要点,一是处理显示字符区的地址,另一个就是字符串的显示
(1)字符串的显示相对比较容易,用两个指针寄存器移动即可
(2)指定处显示字符区的地址的表示:显示字符区开始的物理地址为B8000H,那么可认为段地址为B800H,偏移地址从0开始,要在指定位置开始显示字符,首先必须计算指定位置的偏移地址,也就是之前总的字符所占的字节数--(指定行数-1)*80*2+(指定列数-1)*2
对于(指定行数-1)*2*80我的处理为先乘2再乘80,即先把2保存在默认的al中,然后与(指定行数-1)进行8位乘法,所得结果虽然是存储在整个ax中,但可以看到ah的值为0...
(1)字符串的显示相对比较容易,用两个指针寄存器移动即可
(2)指定处显示字符区的地址的表示:显示字符区开始的物理地址为B8000H,那么可认为段地址为B800H,偏移地址从0开始,要在指定位置开始显示字符,首先必须计算指定位置的偏移地址,也就是之前总的字符所占的字节数--(指定行数-1)*80*2+(指定列数-1)*2
对于(指定行数-1)*2*80我的处理为先乘2再乘80,即先把2保存在默认的al中,然后与(指定行数-1)进行8位乘法,所得结果虽然是存储在整个ax中,但可以看到ah的值为0...
阅读全文 |
评论次数(1) |
浏览次数(795) |
所属类型(程序实验)
[2008-04-12 02:26] 实验10(2)解决除法溢出的问题
本实验主要弄清楚根据提示的公式商的高4位的值,低4位的值是怎样得来的
公式X/N=int(H/N)*65535+[rem(H/N)*65535+L]/N
int(H/N)*65535得出的值就是(X/N)的商的高4位,
也就是说(H/N)的到的商将最终存储在dx中,(我在思考的时候认定此次除法的除数是16位的,其实可以是8位的,8位的可能会减少寄存器的操作,有时间再写写)
而[rem(H/N)*65535+L]/N求出的商即为(X/N)的商的低4位,所得出的余数就是(X/N)的余数
即(H/N)所得到的余数放在dx中,将L放在ax中,再次进行除数为16位的除法
我以书中...
公式X/N=int(H/N)*65535+[rem(H/N)*65535+L]/N
int(H/N)*65535得出的值就是(X/N)的商的高4位,
也就是说(H/N)的到的商将最终存储在dx中,(我在思考的时候认定此次除法的除数是16位的,其实可以是8位的,8位的可能会减少寄存器的操作,有时间再写写)
而[rem(H/N)*65535+L]/N求出的商即为(X/N)的商的低4位,所得出的余数就是(X/N)的余数
即(H/N)所得到的余数放在dx中,将L放在ax中,再次进行除数为16位的除法
我以书中...
阅读全文 |
评论次数(2) |
浏览次数(477) |
所属类型(程序实验)