哎...痛苦.如此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
- [游客] 过程的回味真是无穷! 08/05 17:57
- [kingwrcy] 多谢提示.已经过去接近4个月了.由于工作原因,汇编一直没碰了.哎.准备重新温习下. 07/31 15:09
- [younggay] 分析没有问题。加油! 04/15 16:43
- [younggay] 回答正确。 04/15 16:41
- [游客] 不知道为什么用c做code段老是报错.改成才c1就可以了.莫名其妙 我用的编辑器是masmp 04/15 15:48
- [游客] 嗯,说的很对。这里的栈操作就是一个一个的完成数据移送。 04/15 15:44
- [游客] 刚开始是这样的,弄得慢没关系,只要你努力,总会有结果的。思维是锻炼出来的,经过这程序,再有类似的思维 04/15 11:29
- [游客] 得到别人的技术,不如学会别人的思维方式。从自己参考别人的代码过程,要反思自己思维上的不足。 完 04/15 11:25
- [游客] 嗯。分析的很正确。 注意体会jmp的执行原理。 04/15 11:21
- [游客] 调程序,尤其是汇编程序,耐心是必备的。 04/15 09:37
[ 游客 发表于 2009-04-15 09:28 ]
经过磨砺才能成长,看来博主的磨炼没白搭。呵呵
[ 游客 发表于 2014-08-05 17:57 ]
过程的回味真是无穷!