wufadeshou 发表于 2012-9-14 17:17:02

大家帮忙看下我的这个程序哪里出错了。


    程序的作用是将 data段中第一组数据的3次方。。结果存在后面的一组的dword单元中
assume cs:code ds:data
data segment
dw 1,2,3,4,5,6,7,8
dw 0,0,0,0,0,0,0,0
data ends
code segment
start: mov ax,data
       mov ds,ax
   
    mov si,0
    mov cx,8
    s:         
      mov bx, ds:
      mov ax,bx
      mulbx
   mulbx
   movds:,ax
   inc si
   loop s
   mov ax,4c00h
   int 21h
   code ends
end start

梦幻羽羽 发表于 2012-9-14 17:17:03

呵呵楼主,   你看看~

问题:为什么无法实现数字n的3次方

分析:1,ds里的 数字是dw型。是一个字,每个字占二个字节,所以是add si, 2   
            2,mul bx   这样是16位运算(bx,是通用寄存器,是十六位的),值默认在ax(低十六位) 和dx (高十六位) 中,所以应该是mul 8位寄存器,我是用mul bl (换做别的8位寄存器也可以)

代码如下assume cs:code, ds:data

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

code segment

start:mov ax,data
      mov ds,ax
      mov si,0
      mov cx,8
   s: mov bx, ds:
      mov ax,bx
      mul bl
      mul bl
      mov ds:,ax
      add si, 2
      loop s
      mov ax,4c00h
      int 21h
          
code ends
end start呵呵楼主希望能帮助你,bye~

仁意 发表于 2012-9-14 22:04:59

我也是才学完汇编语言第二版,不敢保证全部正确,以下是我的看法:

数据定义中dw 0,0,0,0,0,0,0,0改为dd 0,0,0,0,0,0,0,0
循环里面:movds:,ax
                  inc si
也有问题
因为第一排数据是dw,字型数据,所以si要加2,add si,2   或者用两个inc si
还有3次方的结果存放在dx,ax中,是双字数据,所以第二排定义的数据是dd(双字)
存放结果应该是:mov ds:,ax
                           mov ds:,dx(因为要有对比,好看清楚,所以写的麻烦点)

cp2833 发表于 2012-9-14 22:41:26

楼上的正解
页: [1]
查看完整版本: 大家帮忙看下我的这个程序哪里出错了。