+ -
当前位置:首页 → 问答吧 → 1) 在数据段中依次存入10,11,12,13,14,15,16,17,将其相加,并将结果存入DX寄存器。

1) 在数据段中依次存入10,11,12,13,14,15,16,17,将其相加,并将结果存入DX寄存器。

时间:2011-01-03

来源:互联网

我的代码是:
data segment
  data1 db 10,11,12,13,14,15,16,17
  data ends
code segment
  assume cs:code,ds:data
 start:
  mov ax,data
  mov ds,ax
  mov cx,8h
  mov dx,0h
  s:
  add dx,[si]
  add si,2
  loop s
  mov ax,4c00h
  int 21h
  code ends
  end start



哪里错了 ?用 DEBUG跟踪 DX 值不变啊

作者: rainfoxer   发布时间: 2011-01-03

add dx,[si] 字单元
data1 db 10,11,12,13,14,15,16,17 字节单元


再说你给SI赋值了么???
这么大的错误 ... 居然没发现

作者: znxllyuan   发布时间: 2011-01-03

data segment
  data1 dw 10,11,12,13,14,15,16,17
  data ends
code segment
  assume cs:code,ds:data
 start:
  mov ax,data
  mov ds,ax
  mov cx,8h
  mov dx,0h
  mov si,data1
  s:
  add dx,[si]
  add si,2
  loop s
  mov ax,4c00h
  int 21h
  code ends
  end start

这样还是不行 SI不是默认DS吗?我刚学 求教

作者: rainfoxer   发布时间: 2011-01-03

引用 1 楼 znxllyuan 的回复:
add dx,[si] 字单元
data1 db 10,11,12,13,14,15,16,17 字节单元


再说你给SI赋值了么???
这么大的错误 ... 居然没发现

data segment
  data1 dw 10,11,12,13,14,15,16,17
  data ends
code segment
  assume cs:code,ds:data
 start:
  mov ax,data
  mov ds,ax
  mov cx,8h
  mov dx,0h
  mov si,data1
  s:
  add dx,[si]
  add si,2
  loop s
  mov ax,4c00h
  int 21h
  code ends
  end start

这样还是不行 SI不是默认DS吗?我刚学 求教

作者: rainfoxer   发布时间: 2011-01-03

默认段前缀是DS
  如果把SI当做指针你得给他赋值阿~要不汇编器怎么知道SI指向哪?
  mov si,offset data1
  或
  lea si,data1
  或
  mov si,0
  才能指向第一个数据 10

  mov si,data1
  这是把 10送入了SI

  data1 db 10,11,12,13,14,15,16,17
  DATA1 定义的是字节型数据 所以用DL做加法
  add dl,[si]
  mov dh,0
  否则 ADD DX,[SI] 加的就是两个字节数据了

作者: znxllyuan   发布时间: 2011-01-03

引用 4 楼 znxllyuan 的回复:
默认段前缀是DS
如果把SI当做指针你得给他赋值阿~要不汇编器怎么知道SI指向哪?
mov si,offset data1

lea si,data1

mov si,0
才能指向第一个数据 10

mov si,data1
这是把 10送入了SI

data1 db 10,11,12,13,14,15,16,17
DATA……
data segment
  data1 dw 10,11,12,13,14,15,16,17
  data ends
code segment
  assume cs:code,ds:data
 start:
  mov ax,data
  mov ds,ax
  mov cx,8h
  mov dx,0h
  mov si,offset data1
  s:
  add dx,[si]
  add si,2
  loop s
  mov ax,4c00h
  int 21h
  code ends
  end start  
这样行吗 ?怎么还是看不到DX的 变化 还是0000

作者: rainfoxer   发布时间: 2011-01-03

assume cs:code,ds:data
data segment
data1 db 10,11,12,13,14,15,16,17
data ends
code segment
start:
  mov ax,data
  mov ds,ax
  xor ax,ax
  mov si,offset data
  mov cx,8
sum:
  add dl,[bx]
  adc dh,0
  inc bx
  loop sum
  mov ah,4ch
  int 21h
code ends
 end start

作者: znxllyuan   发布时间: 2011-01-03

引用 5 楼 rainfoxer 的回复:
引用 4 楼 znxllyuan 的回复:
默认段前缀是DS
如果把SI当做指针你得给他赋值阿~要不汇编器怎么知道SI指向哪?
mov si,offset data1

lea si,data1

mov si,0
才能指向第一个数据 10

mov si,data1
这是把 10送入了SI

data1 db 10,11,12,13,14,15,16,17
DAT……


 4楼已经解释的很清楚了 数据类型要匹配 
 6 楼是标准的

作者: znxllyuan   发布时间: 2011-01-03

引用 6 楼 znxllyuan 的回复:
assume cs:code,ds:data
data segment
data1 db 10,11,12,13,14,15,16,17
data ends
code segment
start:
mov ax,data
mov ds,ax
xor ax,ax
mov si,offset data
mov cx,8
sum:
add dl,[bx]
……

为什么 最后 DX的值 不是006C呢 ?我是直接用-g和-r查看的

作者: rainfoxer   发布时间: 2011-01-03

引用 8 楼 rainfoxer 的回复:
引用 6 楼 znxllyuan 的回复:
assume cs:code,ds:data
data segment
data1 db 10,11,12,13,14,15,16,17
data ends
code segment
start:
mov ax,data
mov ds,ax
xor ax,ax
mov si,offset data
mov cx,8
sum:
a……

注意红色字部分

作者: masmaster   发布时间: 2011-01-03

引用 9 楼 masmaster 的回复:
引用 8 楼 rainfoxer 的回复:
引用 6 楼 znxllyuan 的回复:
assume cs:code,ds:data
data segment
data1 db 10,11,12,13,14,15,16,17
data ends
code segment
start:
mov ax,data
mov ds,ax
xor ax,ax
mov si,offset ……

哦, 是我看错啦 
assume cs:code,ds:data
data segment
data1 db 12,23,34,56,67,89,90,80
data ends
code segment
start:
  mov ax,data ;指定数据段
  mov ds,ax
  mov ax,0 ;AX=结果,先初始化一下
  mov bx,offset data1 ;将数字首地址指向BX
  mov cx,8 ;累加次数
sum:
  add al,[bx] ;低位相加
  adc ah,0 ;进位加法,如有进位则把CF加上
  inc bx ;指向下一个数值
  loop sum ;循环继续

  mov ah,4ch
  int 21h
code ends
end start

作者: masmaster   发布时间: 2011-01-03

热门下载

更多