逆流杀 发表于 2014-9-26 18:54:05

额,,想不通

assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,6
b ends

code segment
start:
      mov ax,a
      mov ds,ax
      mov bx,0
      mov cx,8
      s:
      mov al,ds:
      add al,ds:
      mov ds:,al
      inc bx
      loop s

      mov ax,4c00h
      int 21h
code ends
end start


为什么a,b没声明,也可以编译成功,

傲天 发表于 2014-9-26 18:54:06

如果对你有帮助,请把分给我,谢谢。

xiaosawanjava 发表于 2014-9-26 20:16:35

本帖最后由 xiaosawanjava 于 2014-9-26 20:21 编辑


假设:assume ds:a
如果有assume的话,那么程序就知道db 1,2,3,4,5,6,7,8这一串数据内存地址通过 a 关联了ds ,那么这串数据段地址就是ds 里面存的地址,
如果没有的话,那么程序就不知道 a 数据段的段地址在哪,就不能定位到这一串字符串所在的位置,也就是说,没有assumea 段里面的1 的地址是什么?,如果有我就知道它是 ds段地址*16+ 0 偏移 得出的物理地址。
没有assume程序只是不知道 a 数据段的段地址在哪,并不会影响程序征程运行

流行语 发表于 2014-9-26 21:55:04

这是王爽书上说的。

青玄 发表于 2014-9-27 12:45:54

恩恩! 不错! 支持楼上的回答!

逆流杀 发表于 2014-9-27 17:50:41

青玄 发表于 2014-9-27 12:45
恩恩! 不错! 支持楼上的回答!

额,先谢了
请看一下《汇编语言》--第二版(王爽老师)这本书的实验5:编写、调试具有多个段的程序,第5题和第六题。是不是书本出错了?
就算这个不用事先声明a,b,c,和哪个段寄存器相关联,而是在code段中给出关系,我把答案中3
中解法全试了一下,呵呵,都是错的,根本编译不了,要疯了
实验5 编写、调试具有多个段的程序

(5)程序如下,编写code段中代码,将a段和b段中的数据依次相加,将结果存到C段中。

(三个程序)



程序一:两次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax

       mov ax,b

       mov es,ax

       mov bx,0

       mov cx,8

    s: mov al,

       add es:,al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:

       mov ,al

       inc bx

       loop s0

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序二:一次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax   ;ds指向a段地址

       mov ax,b

       mov es,ax   ;es指向b段地址

       mov bx,0

       mov cx,8

    s: mov al,

       add al,es:

       mov dx,c

       mov ds,dx   ;ds指向c段地址

       mov ,al

       mov ax,a

       mov ds,ax   ;重新将ds指向a段(好像此处还能改进)

       inc bx

       loop s

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序三:程序二的改进版

assume cs:code

a segment

      db 1,2,3,4,5,6,7,8

a ends

b segment

      db 1,2,3,4,5,6,7,8

b ends

c segment

      db 0,0,0,0,0,0,0,0

c ends

code segment

start:

      mov ax,a

      mov ds,ax

      mov ax,b

      mov es,ax

      mov ax,c

      mov ss,ax

      mov bx,0

      mov cx,8

s:      mov ax,

      mov ss:,ax

      mov ax,es:

      add ss:,ax

      inc bx

      loop s

      mov ax,4c00h

      int 21h

code ends

end start

逆流杀 发表于 2014-9-27 17:51:13

流行语 发表于 2014-9-26 21:55
这是王爽书上说的。

额,先谢了
请看一下《汇编语言》--第二版(王爽老师)这本书的实验5:编写、调试具有多个段的程序,第5题和第六题。是不是书本出错了?
就算这个不用事先声明a,b,c,和哪个段寄存器相关联,而是在code段中给出关系,我把答案中3
中解法全试了一下,呵呵,都是错的,根本编译不了,要疯了
实验5 编写、调试具有多个段的程序

(5)程序如下,编写code段中代码,将a段和b段中的数据依次相加,将结果存到C段中。

(三个程序)



程序一:两次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax

       mov ax,b

       mov es,ax

       mov bx,0

       mov cx,8

    s: mov al,

       add es:,al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:

       mov ,al

       inc bx

       loop s0

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序二:一次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax   ;ds指向a段地址

       mov ax,b

       mov es,ax   ;es指向b段地址

       mov bx,0

       mov cx,8

    s: mov al,

       add al,es:

       mov dx,c

       mov ds,dx   ;ds指向c段地址

       mov ,al

       mov ax,a

       mov ds,ax   ;重新将ds指向a段(好像此处还能改进)

       inc bx

       loop s

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序三:程序二的改进版

assume cs:code

a segment

      db 1,2,3,4,5,6,7,8

a ends

b segment

      db 1,2,3,4,5,6,7,8

b ends

c segment

      db 0,0,0,0,0,0,0,0

c ends

code segment

start:

      mov ax,a

      mov ds,ax

      mov ax,b

      mov es,ax

      mov ax,c

      mov ss,ax

      mov bx,0

      mov cx,8

s:      mov ax,

      mov ss:,ax

      mov ax,es:

      add ss:,ax

      inc bx

      loop s

      mov ax,4c00h

      int 21h

code ends

end start

逆流杀 发表于 2014-9-27 17:51:52

xiaosawanjava 发表于 2014-9-26 20:16
假设:assume ds:a
如果有assume的话,那么程序就知道db 1,2,3,4,5,6,7,8这一串数据内存地址通过 a...

额,先谢了
请看一下《汇编语言》--第二版(王爽老师)这本书的实验5:编写、调试具有多个段的程序,第5题和第六题。是不是书本出错了?
就算这个不用事先声明a,b,c,和哪个段寄存器相关联,而是在code段中给出关系,我把答案中3
中解法全试了一下,呵呵,都是错的,根本编译不了,要疯了
实验5 编写、调试具有多个段的程序

(5)程序如下,编写code段中代码,将a段和b段中的数据依次相加,将结果存到C段中。

(三个程序)



程序一:两次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax

       mov ax,b

       mov es,ax

       mov bx,0

       mov cx,8

    s: mov al,

       add es:,al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:

       mov ,al

       inc bx

       loop s0

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序二:一次循环

assume cs:code

a segment

    db 1,2,3,4,5,6,7,8

a ends

b segment

    db 1,2,3,4,5,6,7,8

b ends

c segment

    db 0,0,0,0,0,0,0,0

c ends

code segment

start: mov ax,a

       mov ds,ax   ;ds指向a段地址

       mov ax,b

       mov es,ax   ;es指向b段地址

       mov bx,0

       mov cx,8

    s: mov al,

       add al,es:

       mov dx,c

       mov ds,dx   ;ds指向c段地址

       mov ,al

       mov ax,a

       mov ds,ax   ;重新将ds指向a段(好像此处还能改进)

       inc bx

       loop s

    mov ax,4c00h

    int 21h

code ends

end start



=======================华丽的分割线===============================



程序三:程序二的改进版

assume cs:code

a segment

      db 1,2,3,4,5,6,7,8

a ends

b segment

      db 1,2,3,4,5,6,7,8

b ends

c segment

      db 0,0,0,0,0,0,0,0

c ends

code segment

start:

      mov ax,a

      mov ds,ax

      mov ax,b

      mov es,ax

      mov ax,c

      mov ss,ax

      mov bx,0

      mov cx,8

s:      mov ax,

      mov ss:,ax

      mov ax,es:

      add ss:,ax

      inc bx

      loop s

      mov ax,4c00h

      int 21h

code ends

end start

流行语 发表于 2014-9-27 21:52:54

都什么错误啊

逆流杀 发表于 2014-9-27 22:43:42

流行语 发表于 2014-9-27 21:52
都什么错误啊

编译通过不了,说c有错误

xiaosawanjava 发表于 2014-9-27 23:08:42

逆流杀 发表于 2014-9-27 22:43
编译通过不了,说c有错误


c好像是关键字,你把c 改成其他的字符试试。

流行语 发表于 2014-9-28 07:57:13

你用的汇编编译器替换成masm5.0的,然后用masm和link进行编译和链接就OK了.

大个的糖果 发表于 2014-10-31 23:35:11

傲天 发表于 2015-2-27 01:01:52

不用声明,a,b,c本身就代表一个地址,虽然没和ds关联,但一样也是个地址,再退一万步说,不管a是什么值,mov ax,a也不会出错,程序可以运行,但结果就不得而知了

fast 发表于 2015-6-21 03:34:39

xuexile
{:1_1:}
页: [1]
查看完整版本: 额,,想不通