鱼C论坛

 找回密码
 立即注册
查看: 2210|回复: 4

[争议讨论] 汇编语言 实验5,第(5)题的编程我是这样写的,不知对否

[复制链接]
发表于 2012-7-23 10:01:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 bx, 0
    mov ax, cs
    sub ax, 3h
    mov ds, ax
    mov ax, cs
    sub ax, 2h
    mov ss, ax
    mov ax, cs
    sub ax, 1h
    mov es, ax
    mov cx, 8
  s:mov al, [bx]
    mov es:[bx], al
    inc bx   
    loop s
    mov bx, 0
    mov cx, 8
s0:mov al, es:[bx]
    mov dl, ss:[bx]
    add al, dl
    mov es:[bx], al
    inc bx
    loop s0
       mov ax, 4c00h
       int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-23 13:32:38 | 显示全部楼层
第一我想问一下 sub ax, 3h
sub ax, 2h
sub ax, 1h
这是什么用途?能读到a,b,c段的正确地址吗?我debug了一下。用d命令查看了。发现读不出来a,b,c的段地址
由此引发的问题就是,你读的数据不是a,b段的数据,你的结果也写不进c段。

第二你把ss段这个栈段寄存器当ds寄存器来用了。你的代码中写出了这样的语句mov dl, ss:[bx]
没有这个用法吧。 要正确读到前面定义的a,b,c段的地址,应该这样写啊
  1. mov ax,a
  2. mov ds,ax
  3. mov bx,b
  4. mov es,bx
复制代码
我明白你的想法,你想把a,b,c段直接在前面就把他们的段地址给确定好,但是能用的段寄存器只有ds,和es。所以你想到了动用ss的想法。但是应该不可以这样用ss的。(我百度了一下,貌似有这个强行将ss栈寄存器当普通段寄存器来用的,就是有ss:[bx]这个用法。不过我感觉最好别这样用。)

贴上标准答案你自己揣摩一下吧
  1. assume cs:code

  2. a segment

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

  4. a ends

  5. b segment

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

  7. b ends

  8. c segment

  9. db 0,0,0,0,0,0,0,0

  10. c ends

  11. code segment

  12. start: mov ax,a

  13. mov ds,ax

  14. mov ax,b

  15. mov es,ax

  16. mov bx,0

  17. mov cx,8

  18. s: mov al,[bx]

  19. add es:[bx],al

  20. inc bx

  21. loop s

  22. mov ax,c

  23. mov ds,ax

  24. mov bx,0

  25. mov cx,8

  26. s0: mov al,es:[bx]

  27. mov [bx],al

  28. inc bx

  29. loop s0

  30. mov ax,4c00h

  31. int 21h

  32. code ends

  33. end start

复制代码

我也是刚学汇编,说的不对,望指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-23 14:00:57 | 显示全部楼层
本帖最后由 lukelqz 于 2012-7-23 14:07 编辑

楼主不好意思,当我前面说的放屁。你写的代码没有问题。只不过有点非主流。debug调试结果在附件。我开始的第一条说错了。第二条也有这种用法。I'm sorry。 debug.rar (92.1 KB, 下载次数: 2)



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-24 09:08:26 | 显示全部楼层
谢谢你的回答,我的答题思路是按照前面那几个实验说如果段中的地址占N个字节,则程序加载后,该段实际的占有空间为16*(16/N +1)这个思路来解题的,我本想去网站去找找小甲鱼的答案,没找到,才贴出来的,看了你的答案我才恍然大悟,原来刚开始assume那里没有进行ss:a 这种声明过也可以mov ax, a段地址操作的,真的谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-24 09:26:41 | 显示全部楼层

其实想说,我昨天看你做的时候,我刚好把第6章看完,实验五,还没做,没看到前面的段地址16*(16/n+1)的结论。昨天晚上我才从头看实验五的。我也懂了你为什么那样编了。呵呵,互勉互勉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-1 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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