鱼C论坛

 找回密码
 立即注册
查看: 3528|回复: 15

[汇编作业] 额,,想不通

[复制链接]
发表于 2014-9-26 18:54:05 | 显示全部楼层 |阅读模式
20鱼币
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:[bx]
        add al,ds:[bx + 8]
        mov ds:[bx + 16],al
        inc bx
        loop s

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


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

最佳答案

查看完整内容

如果对你有帮助,请把分给我,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-26 18:54:06 | 显示全部楼层
如果对你有帮助,请把分给我,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 数据段的段地址在哪,就不能定位到这一串字符串所在的位置,也就是说,没有assume  a 段里面的  1 的地址是什么?,如果有我就知道它是 ds段地址*16+ 0 偏移 得出的物理地址。
没有assume  程序只是不知道 a 数据段的段地址在哪,并不会影响程序征程运行

点评

恩恩! 不错!  发表于 2014-9-27 12:45

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
逆流杀 + 5 + 5 + 3 谢谢哥哥的热心帮助

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-26 21:55:04 | 显示全部楼层
这是王爽书上说的。
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-27 12:45:54 | 显示全部楼层
恩恩! 不错! 支持楼上的回答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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,[bx]

       add es:[bx],al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:[bx]

       mov [bx],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,[bx]

       add al,es:[bx]

       mov dx,c

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

       mov [bx],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,[bx]

        mov ss:[bx],ax

        mov ax,es:[bx]

        add ss:[bx],ax

        inc bx

        loop s

        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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,[bx]

       add es:[bx],al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:[bx]

       mov [bx],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,[bx]

       add al,es:[bx]

       mov dx,c

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

       mov [bx],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,[bx]

        mov ss:[bx],ax

        mov ax,es:[bx]

        add ss:[bx],ax

        inc bx

        loop s

        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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,[bx]

       add es:[bx],al

       inc bx

       loop s

       mov ax,c

       mov ds,ax

       mov bx,0

       mov cx,8

   s0: mov al,es:[bx]

       mov [bx],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,[bx]

       add al,es:[bx]

       mov dx,c

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

       mov [bx],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,[bx]

        mov ss:[bx],ax

        mov ax,es:[bx]

        add ss:[bx],ax

        inc bx

        loop s

        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-27 21:52:54 | 显示全部楼层
都什么错误啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-27 22:43:42 | 显示全部楼层

编译通过不了,说c有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-27 23:08:42 | 显示全部楼层
逆流杀 发表于 2014-9-27 22:43
编译通过不了,说c有错误


c好像是关键字,你把c 改成其他的字符试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-28 07:57:13 | 显示全部楼层
你用的汇编编译器替换成masm5.0的,然后用masm和link进行编译和链接就OK了.

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
逆流杀 + 5 + 5 + 2 谢谢,亲

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-10-31 23:35:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-27 01:01:52 | 显示全部楼层
不用声明,a,b,c本身就代表一个地址,虽然没和ds关联,但一样也是个地址,再退一万步说,不管a是什么值,mov ax,a也不会出错,程序可以运行,但结果就不得而知了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-21 03:34:39 | 显示全部楼层
xuexile
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表