鱼C论坛

 找回密码
 立即注册
查看: 3818|回复: 11

[汇编作业] 实验5 编写、调试具有多个段的程序

[复制链接]
发表于 2020-3-29 14:12:27 | 显示全部楼层 |阅读模式

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

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

x
(1)
  1. assume cs:code,ds:data,ss:stack

  2. data segment
  3.         dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
  4. data ends
  5. stack segment
  6.         dw 0,0,0,0,0,0,0,0
  7. stack ends

  8. code segment
  9. start:mov ax,stack
  10.         mov ss,ax
  11.         mov sp,16
  12.         mov ax,data
  13.         mov ds,ax
  14.         push ds:[0]
  15.         push ds:[2]
  16.         pop ds:[2]
  17.         pop ds:[0]

  18.        
  19.         mov ax,4c00H
  20.         int 21h
  21. code ends
  22. end start
复制代码

①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为082F,data替换为082E
-d 082e
082e:0000 23 01 56 04 89 bc 0a-ef 0d ed 0f ba 0c 87 09
对比
  1. data segment
  2.         dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
  3. data ends
复制代码

可知数据的排列方式
cpu执行后
082e:0000 23 01 56 04 89 bc 0a-ef 0d ed 0f ba 0c 87 09 data无变化
②cs=0830 ss=082f ds=082e
③X-0002H X-0001H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-29 14:24:11 | 显示全部楼层
本帖最后由 流风逸雪 于 2020-3-29 14:32 编辑

(2)
  1. assume cs:code,ds:data,ss:stack

  2. data segment
  3.         dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
  4. data ends
  5. stack segment
  6.         dw 0,0,0,0,0,0,0,0
  7. stack ends

  8. code segment
  9. start:mov ax,stack
  10.         mov ss,ax
  11.         mov sp,16
  12.         mov ax,data
  13.         mov ds,ax
  14.         push ds:[0]
  15.         push ds:[2]
  16.         pop ds:[2]
  17.         pop ds:[0]

  18.        
  19.         mov ax,4c00H
  20.         int 21h
  21. code ends
  22. end start
复制代码

①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为082F,data替换为082E
-d 082e
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00
cpu执行后
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00 data无变化
②cs=0830 ss=082f ds=082e
③X-0002H X-0001H
④(N+16)整除16再乘以16个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-29 14:41:55 | 显示全部楼层
本帖最后由 流风逸雪 于 2020-4-8 12:56 编辑

(3)
  1. assume cs:code,ds:data,ss:stack



  2. code segment
  3. start:mov ax,stack
  4.         mov ss,ax
  5.         mov sp,16
  6.         mov ax,data
  7.         mov ds,ax
  8.         push ds:[0]
  9.         push ds:[2]
  10.         pop ds:[2]
  11.         pop ds:[0]

  12.        
  13.         mov ax,4c00H
  14.         int 21h
  15. code ends
  16. data segment
  17.         dw 0123H,0456H
  18. data ends
  19. stack segment
  20.         dw 0,0
  21. stack ends
  22. end start
复制代码

①ss=082D,cs=0830,ds=081E
-u之后,原本stack替换为0832,data替换为0831
-d 0831
0831:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00
cpu执行后
082e:0000 23 01 56 04 00 00 00-00 00 00 00 00 00 00 00 data无变化
②cs=082e ss=0832 ds=0831
③X+0003H X+0004H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 14:56:45 | 显示全部楼层
(4)
第1题不行,debug后一堆无关代码
第2题也不行,debug后也是一堆无关代码
第3题可以,debug后是正确代码
可能1、2将code放在data和stack后面但end不知道在start的code的末尾划边界保护code
以至于其他的程序将code的位置覆盖掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 12:18:23 | 显示全部楼层
(5)
  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:
  13.         mov ax,a
  14.         mov ds,ax
  15.         mov cx,8
  16.         mov bx,0
  17.        
  18. s:        mov ax,[bx]//还想过用ss:[sp]来扩展更多可用指针变量
  19.         add bx,16//结果还不如利用a,b,c数据堆放的结构来变换bx
  20.         add ax,[bx]//虽然这种方式很憨,但却体现出了底层实际上运行的方式
  21.         add bx,16
  22.         mov [bx],ax
  23.         sub bx,32
  24.         add bx,2
  25.         loop s

  26.         mov ax,4c00H
  27.         int 21h
  28. code ends
  29. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-4-1 13:22:49 | 显示全部楼层
(6)
  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 0,0,0,0,0,0,0,0
  7. b ends

  8. code segment
  9. start:
  10.         mov ax,a
  11.         mov ds,ax
  12.         mov ax,b
  13.         mov ss,ax
  14.         mov sp,8
  15.         mov cx,4//word 型为两个字节,即0000H,八个字节就要执行4次
  16.         mov bx,0
  17.        
  18. s:        push [bx]
  19.         add bx,2
  20.         loop s

  21.         mov ax,4c00H
  22.         int 21h
  23. code ends
  24. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 15:49:01 | 显示全部楼层
流风逸雪 发表于 2020-3-29 14:41
(3)

①ss=082D,cs=0830,ds=081E

你好,我怎么觉得第三问是X+0003H,X+0004H呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-8 12:56:10 | 显示全部楼层
何足道 发表于 2020-4-5 15:49
你好,我怎么觉得第三问是X+0003H,X+0004H呢?

谢谢指正,现在改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-11 11:01:34 | 显示全部楼层
第六题的SP=8是不是有问题呀,SP每次不都是+2或-2么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 20:51:17 | 显示全部楼层
第六题出现了一个错误,由于8086 push 和 pop 的操作 以字型为单位 ,每次push [bx],拿出来的数其实是高地址+低地址 然后再放到栈空间,例如拿出来其实是0201而不是0102,这样导致最后push进去的最底层其实是02 ,再上一层是01,程序运行完后 栈空间0地址到7地址其实是-- 07 08 05 06 03 04 02 01; 解决方法可以在循环中用ah承接第一次[bx],再自增inc bx ,再用al承接第二次[bx[,这样ax=0102,push ax 之后最底层才是01,再上层才是02,最后答案才是逆序08 07 06 05 04 03 02 01.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-29 11:29:10 | 显示全部楼层
楼主,第五题定义的是db吧,bx+2感觉有点问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-31 10:27:41 | 显示全部楼层
你是纯纯的SB,瞎搞  第五题你的b和c呢   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 14:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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