奥普瓯江 发表于 2018-9-6 17:17:30

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

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

编程,计算data段中第一组数据的3次方,结果保存在后面一组dword单元中。
assume cs:code
data segment
      dw 1, 2, 3, 4, 5, 6, 7, 8
      dd0, 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,        ;把ds:中的内存数据传给bx
         call cube         ;把下mov , ax命令首地址压进站中并跳转至cube标记处,并在cube标记处项下执行
         mov , ax       ;跳转回来后开始执行把ax中储存的数据传给内存ds:
         mov .2, dx    ;dx寄存器中的数据传给内存ds:
         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 , ax),并释放站中的数据
code ends
end start
问题在mul bx中
mul bx                  ;这里的结果应该是储存在了ax, 和dx中
mul bx                  ;这里在现在这个程序中应该是只取了一个ax中的数值也就是低位寄存器中的数据(ax),高位寄存器的数据(dx)并没有读取进来,不知我这么理解是否对,如果只是运算小于上一个乘机小于65535的话是正确的如果高于这个数是否算出来的就是错误的数值呢?
我想问的问题是,为什么这么处理,是否是程序的问题,或者是大于65535的数据还有别的运算方法

57158597@qq.com 发表于 2018-9-6 17:42:43

你这段代码只是计算1-8这8个数字的3次方
mul bx
mul bx
这里得到的值并没有大于65535,所以这个程序没问题
但如果要计算的数的3次方大于65535,要用到DX寄存器的话就不能这么写了,有别的写法
页: [1]
查看完整版本: 参数结果和传递其中的例题有些不懂