鱼C论坛

 找回密码
 立即注册
查看: 2299|回复: 1

参数结果和传递其中的例题有些不懂

[复制链接]
发表于 2018-9-6 17:17:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 奥普瓯江 于 2018-9-6 17:17 编辑

编程,计算data段中第一组数据的3次方,结果保存在后面一组dword单元中。
assume cs:code
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    ;把数据段内存首地址传给ax
        mov ds, ax       ;把ax中储存的数据传给ds寄存器
        mov si, 0          ;设定si八位寄存器为零,我感觉si就相当一个变量一样
        mov di, 16        ;设定di八位寄存器为16指向dd
        
   
         mov cx, 8         ;设定cx寄存器初始值为8,这个是用于loop的计数器
s:      mov bx, [si]       ;把ds:[si]中的内存数据传给bx
         call cube           ;把下mov [di], ax命令首地址压进站中并跳转至cube标记处,并在cube标记处项下执行
         mov [di], ax       ;跳转回来后开始执行把ax中储存的数据传给内存ds:[di]
         mov [di].2, dx    ;dx寄存器中的数据传给内存ds:[di + 2]
         add si, 2            ;si寄存器中的数据加2
         add di, 4            ;di寄存器中的数据加4
         loop s                 ;再次循环,只有cx寄存器的数据为零的时候才结束循环,loop的运作方式是每当到达loop处cx减1等于cx如不等于零则继续循环如是零循环结束

         mov ax, 4c00h      ;结束本次程序
         int 21h

cube: mov ax, bx            ;把bx中的数据传给ax
         mul bx                  ;ax*bx       
         mul bx                  ;(ax*bx)*bx
         ret                        ;跳转回站中所储存的偏移地址(move [di], ax),并释放站中的数据
code ends
end start
问题在mul bx中
mul bx                  ;这里的结果应该是储存在了ax, 和dx中  
mul bx                  ;这里在现在这个程序中应该是只取了一个ax中的数值也就是低位寄存器中的数据(ax),高位寄存器的数据(dx)并没有读取进来,不知我这么理解是否对,如果只是运算小于上一个乘机小于65535的话是正确的如果高于这个数是否算出来的就是错误的数值呢?  
我想问的问题是,为什么这么处理,是否是程序的问题,或者是大于65535的数据还有别的运算方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-6 17:42:43 | 显示全部楼层
你这段代码只是计算1-8这8个数字的3次方
mul bx
mul bx
这里得到的值并没有大于65535,所以这个程序没问题
但如果要计算的数的3次方大于65535,要用到DX寄存器的话就不能这么写了,有别的写法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-5 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表