额,,想不通
assume cs:codea 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没声明,也可以编译成功,
如果对你有帮助,请把分给我,谢谢。 本帖最后由 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-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-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 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
都什么错误啊
编译通过不了,说c有错误
逆流杀 发表于 2014-9-27 22:43
编译通过不了,说c有错误
c好像是关键字,你把c 改成其他的字符试试。 你用的汇编编译器替换成masm5.0的,然后用masm和link进行编译和链接就OK了. 不用声明,a,b,c本身就代表一个地址,虽然没和ds关联,但一样也是个地址,再退一万步说,不管a是什么值,mov ax,a也不会出错,程序可以运行,但结果就不得而知了 xuexile
{:1_1:}
页:
[1]