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

我的博客

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

[2009-04-13 21:14] 实验10

哎...痛苦.如此easy的题目搞了半天.

晚上只做第一题.第一题前面的实验9其实做过了.

我错的原因也是非常让人郁闷..刚开始的时候.子程序的ret没写.

一直没返回..找了N个小时都不明白咋报错了.重新写一次还是错...

最后没办法.去吃饭了.再来时突然发现了问题所在.哎...

其他的就没什么了.我开始用的是loop,最后发现用loop的话要

保存cx的值.比较麻烦.看了下答案.用的是jmp方式.也可以,而且不用

保存cx的值...凑合着用吧.

测试的时候由于是写到显示缓冲区..debug也看不到结果.那个急啊.

反正就是一直不成功.最后把答案的代码拿过来编译一次.发现也没出现

welcome to masm!等字符.这才想到估计是电脑问题..

马上启动2000的虚拟机.在虚拟机里分别测试我的和答案的.发现都ok.

哎..破本本怎么了啊..莫名其妙啊....郁闷死我了....

哎..现贴出代码:


assume cs:code

data segment

        db 'Welcome to masm!',0

data ends

code segment

start:

                mov dh,20
                
                mov dl,60
                
                mov cl,2
                
                mov ax,data
                
                mov ds,ax
                
                mov si,0
                
                call show_str
                
                mov ax,4c00h
                
                int 21h
                
show_str:

                mov al,0A0H
                
                dec dh
                
                mul dh
                
                mov bx,ax
                
                mov al,2
                
                mul dl
                
                sub ax,2
                
                add bx,ax
                
                mov ax,0B800H
                
                mov es,ax
                
                mov di,0
                
                mov ax,cx
                
                mov ch,0
                
        s: mov cl,[di]
        
                jcxz ok
                
                mov es:[bx+si],cl
                
                mov es:[bx+si+1],al
                
                inc di
                
                add si,2
                
                jmp short s
                
        ok: ret



code ends

end start


哎.实验10啊.注定我克星啊...第二个子程序又卡了一上午..主要是书上的那个公式不明白啊..看了论坛的牛人的代码.还是不知其所以然啊.无奈.拿了个8位10进制数自己一步一步来走下来.终于想通了.可是想通了是想通了.代码还是没写出来.折腾了一早上+参考别人的代码.终于弄懂了..哎....什么脑子啊..

X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

这个公式我刚开始就没怎么理解..那个烦啊.

现在终于想通了.就是:

比如一个数.我说的都是10进制哈.比较好理解.

对于:8765 4321 /10 

X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

H = 8765 L = 4321 ,X = 87654321 N = 10

高4位的商就是876,余数为5.把5*进制.就是5*10000=50000

加上后面的4位就是54321.再除以10,商是5432,余数是1

所以最后的结果就是商位876 5432,余数为1

在汇编里面,因为规定除数是16位.被除数就必须是32位.

第一次除的时候是H/N.H和N都是16位的.所以要把H扩展成32位.默认32

位的高16位放在dx中,低16位放在ax中.又不能改变数的大小.

所以把高16位也就是dx=0,低16位不变.最后就是0:ax/N

除完后ax中是商.dx是余数.把ax保存起来.ax中的值其实就是最后结果

的商的高16位.题目要求保存到dx中.由于下面还要用到dx,我们先保存

到bx中.然后把L,也就是x的低八位和第一步除得的余数合并起来.就是

dx:ax,翻译成物理量就是DX*10000H+AX,然后再除以N.所得的商就是

低16位的商.余数就是整个所得的余数.

写的可能比较混乱..自己看的懂就成哈...反正思路就是

32位(x)/16(n)位:把x前16位/n,保存商,(取其余数*进制+低16位)/n

保存商和余数.2次的商分别就是高16位商和低16位商.相当于第一次

整除了.把余数挪到第二次除的时候用了.

代码如下:

                push ax

                mov ax,dx
                
                mov dx,0
                
                div cx    ;dx:ax=0:ax 也就是0:ax/cx,商保存在ax中,余数在dx中
                
                mov bx,ax ;保存商在bx中
                
                pop ax    
                
                div cx    
                
                mov cx,dx
                
                mov dx,bx
                
                ret
评论次数(2)  |  浏览次数(766)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2009-04-15 09:28  ]

经过磨砺才能成长,看来博主的磨炼没白搭。呵呵

[  游客   发表于  2014-08-05 17:57  ]

过程的回味真是无穷!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码