注册 登录
编程论坛 汇编论坛

百撕不得?

有容就大 发布于 2012-09-03 21:43, 1248 次点击
这是一个功能很简单的程序 代码也没多少
就是计算data段中的第一组数据的立方 在保存在其下一组DWORD单元中
程序已经写好 而且反复看了应该没错 但是发现一个很奇怪的东西 不知道是我错了 还是机器错了?
如果是MASMPlus可以直接拷贝编译 ...
程序代码:
;#Mode=DOS
;
MASMPlus 单文件代码模板 - 纯 DOS 程序
;
--------------------------------------------------------------------
;
单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;
编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;
当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件
assume cs:code, ds:data

data segment
   dw 1, 2, 3, 4, 5, 6, 7, 8
   dd 0, 0, 0, 0, 0, 0, 0, 0
data ends

code segment
  start:     mov ax, data
             mov ds, ax
             mov di, 16
             mov si, 0
            

             mov cx, 8
         s:  mov bx, [si]   

             call cube
             mov [di], ax
             mov [di].2, dx
             add si, 2
             add di, 4
             loop s
            

             mov ax, 4c00h
             int 21h
            

       cube: mov ax, bx
             mul bx
             mul bx
             ret                                 

code ends

end start
运行debug后得到的结果是这个
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


为什么是00 02 00 00 而不是 00 00 00 02? 显然后者才是正确的啊。
求揭秘......


[ 本帖最后由 有容就大 于 2012-9-3 21:48 编辑 ]
26 回复
#2
zklhp2012-09-03 21:46
睡觉了等那些大牛来回答罢

来蹭分了
#3
有容就大2012-09-03 21:50
回复 2楼 zklhp
应该是机器错了 但是为什么机器会错
#4
信箱有效2012-09-03 21:52
先进来看看。坐等高手。
百撕不得,或者千撕一下,估计就得了。
#5
有容就大2012-09-03 21:54
回复 4楼 信箱有效
坐着不撕 你忍得住?
#6
信箱有效2012-09-03 21:56
我在撕资源呢。 不知道什么时候我的屏幕截图才能写出来
#7
有容就大2012-09-03 21:59
回复 6楼 信箱有效
直接搞win32汇编? 膜拜。。。
#8
admin_xyz2012-09-03 22:03
蹭分...等待大牛回答
#9
pangding2012-09-03 23:16
我睡觉了。没准明天上来,有容就自己搞清楚了。
#10
有容就大2012-09-03 23:27
回复 9楼 pangding
我决定判电脑偷梁换柱罪 希望你们给它辩护~~
#11
刘培2012-09-06 16:41
就是 00 02 00 00 啊,电脑没算错啊。。。。。。。
#12
有容就大2012-09-06 17:12
以下是引用刘培在2012-9-6 16:41:46的发言:

就是 00 02 00 00 啊,电脑没算错啊。。。。。。。

难道8的三次方等于2?

#13
有容就大2012-09-06 19:58
以下是引用刘培在2012-9-6 16:41:46的发言:

就是 00 02 00 00 啊,电脑没算错啊。。。。。。。

俺错了 内牛满面啊
#14
刘培2012-09-07 02:16
呵呵,直觉错了不好发现啊。
#15
hu9jj2012-09-07 07:27
是啊,电脑怎么会错呢?电脑怎么能错呢!
#16
有容就大2012-09-07 09:26
以下是引用hu9jj在2012-9-7 07:27:35的发言:

是啊,电脑怎么会错呢?电脑怎么能错呢!

嗬嗬嗬 电脑万岁!!
#17
lxq69668922012-10-24 13:32
这不是对的吗?请说清楚
#18
zhu2240392012-10-29 11:02
乘法指令AX是存放的低字节部分,DX存放高地址
内存存放方式是 你的程序是讲 ax放在低位  dx放在高位
所以是存放方式 是 01 00 00 00  四字节的存放方式 电脑没错啊
mul bx  表达的是 AX*BX   计算完后  ax的值被改变成 AX*BX的低字部分了 BX的值不变   比如计算的是 2的话  那么就是 ax的值=2*2=4 bx=2
你后面再加个MUL  BX    那么就是 ax*bx=4*2=8了  程序立方的计算方法没错误啊
只是当产生了进位后  你上面计算立方的 程序块估计就不能用了  会出现计算错误的 因为DX的部分是没有参加运算的

为什么是00 02 00 00 而不是 00 00 00 02  这个不是很理解  一个字的表示范围 能装下8的 立方为什么你要说是 00000002  按你说的这个结果就是 AX=0000 DX=2000
按00 02 00 00 =0010000000000000=2的9次方啊   结果木有错啊?

你到底想说那般啊

[ 本帖最后由 zhu224039 于 2012-10-29 11:14 编辑 ]
#19
zhu2240392012-10-29 11:09
有容兄  你就别老是完这种+-*/了 木有意思,+ - * /  高级语言省时省事

我觉得更应偏向内存管理 IO设备管理,磁盘管理,计算机的个个部件的工作方式 比较好点

编程是最简单的事,把编程当最难的事来做,更难的事情该怎么做呢 ?

把这个 放放把  有容兄,看见你琢磨这个 真心的替你的时间着急

不管你说怎木想的,我是很久都木有动笔写什么程序了,看看书 ,扩展下理论知识

我打算买个51开发板来玩玩  嘿嘿

#20
zhu2240392012-10-29 11:14
以下是引用有容就大在2012-9-6 17:12:36的发言:


难道8的三次方等于2?
抽你丫的,DEBUG 内存数据显示 是按 16进制显示的  你脑袋该休息休息了
#21
有容就大2012-10-29 14:24
回复 20楼 zhu224039
老兄 俺都认错了 你 还抽俺
现在看于渊那书 哈哈 搞了一个红色的“Hello OS World!”出来。
#22
zhu2240392012-10-29 19:43
书是看不完的,还是得有自己的学习框架才好
这本书上 从0一直讲到N
那本书上 又从0一直讲到 N
何时是个头啊

还不如借用别人书的框体
一个部分一个部分 按照书上的知识点 横向的自己查资料学习

现在我是觉得编程时计算机学习当中最简单的事情,难就难在 计算机这个系统是怎么运行的,每个部分是如何工作的,然后才是编程应用
整天学习别人编程,书上没有的,自己就不懂了,书上有的 你才有的搞,这样不好
#23
zhu2240392012-10-29 19:45
红色的字体  你去看下BIOS中断 里面有 相关的中断调用
用那个就可以了
#24
zhu2240392012-10-29 19:46
回复 21楼 有容就大
你该不是 学会了 《学写操作系统》的第一步了吧
#25
有容就大2012-10-29 21:06
回复 22楼 zhu224039
一上来就研究内核估计吃力啊
我数电模电都没搞过 大学物理也没学过
看计算机组成原理和小说差不多呢 呵呵

#26
有容就大2012-10-29 21:06
回复 24楼 zhu224039
嗯 看到了那个红色的Hello OS World!
#27
无敌小默然2012-11-07 10:06
红色画线处,数值是200h,也就是8的三次方,512.
1