鱼C论坛

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

[汇编作业] 实验5

[复制链接]
发表于 2022-7-18 17:20:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 tyyfly 于 2024-2-25 01:43 编辑

以下为我的答案,不保证正确,如有错误请提出,拜托了!
(1)
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.         dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  4. date 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.                
  13.                 mov ax, data
  14.                 mov ds, ax
  15.                
  16.                 push ds:[0]
  17.                 push ds:[2]
  18.                 pop ds:[2]
  19.                 pop ds:[0]
  20.                
  21.                 mov ax, 4c00h
  22.                 int 21h
  23. code ends
  24. end start
复制代码

1.CPU执行程序,程序返回前,data段中的数据为多少?
A: 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
2.CPU执行程序,程序返回前,CS=___,SS=___,DS=___。
A: CS = code, SS = stack, DS = data
3.设程序加载后,code段的段地址为X,则data段的段地址为___,stack段的段地址为___。
A: X-2, X-1

(2)
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.         dw 0123h,0456h
  4. date ends
  5. stack segment
  6.         dw 0,0
  7. stack ends
  8. code segment
  9. start:        mov ax, stack
  10.                 mov ss, ax
  11.                 mov sp, 16
  12.                
  13.                 mov ax, data
  14.                 mov ds, ax
  15.                
  16.                 push ds:[0]
  17.                 push ds:[2]
  18.                 pop ds:[2]
  19.                 pop ds:[0]
  20.                
  21.                 mov ax, 4c00h
  22.                 int 21h
  23. code ends
  24. end start
复制代码

1.CPU执行程序,程序返回前,data段中的数据为多少?
A: 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
2.CPU执行程序,程序返回前,CS=___,SS=___,DS=___。
A: CS = code, SS = stack, DS = data
3.设程序加载后,code段的段地址为X,则data段的段地址为___,stack段的段地址为___。
A: X-2, X-1
4.
  1. name segment
  2. ...
  3. name ends
复制代码

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为___。
A:(N/16 + 1)*16此答案錯誤,更正為((N+15)/16)*16

(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.                
  7.                 mov ax, data
  8.                 mov ds, ax
  9.                
  10.                 push ds:[0]
  11.                 push ds:[2]
  12.                 pop ds:[2]
  13.                 pop ds:[0]
  14.                
  15.                 mov ax, 4c00h
  16.                 int 21h
  17. code ends
  18. data segment
  19.         dw 0123h,0456h
  20. data ends
  21. stack segment
  22.         dw 0,0
  23. stack ends
  24. end start
复制代码

1.CPU执行程序,程序返回前,data段中的数据为多少?
A: 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
2.CPU执行程序,程序返回前,CS=___,SS=___,DS=___。
A: CS = code, SS = stack, DS = data
3.设程序加载后,code段的段地址为X,则data段的段地址为___,stack段的段地址为___。
A:X+3, X+4

(4)
如果将(1),(2),(3)题中的最后一条伪指令"end start"改为"end"(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
A:第三题即便将"end start"改为"end",依然能正确执行。
   因为start为程序入口,即程序开始执行的地方,如果没有注明入口, 则程序将从程序的开头开始执行,
   而第三题程序的开头即是指令,所以依然能正确执行。

(5)
程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。
assume cs:code
dataA segment
        db 1,2,3,4,5,6,7,8
dataA ends
dataB segment
        db 1,2,3,4,5,6,7,8
dataB ends
dataC segment
        db 0,0,0,0,0,0,0,0
dataC ends
code segment
  1. start:        mov ax, dataA
  2.                 mov ds, ax
  3.                 mov ax, dataB
  4.                 mov es, ax
  5.                 mov ax, dataC
  6.                 mov ss, ax

  7.                 mov bx, 0
  8.                 mov ax, 0
  9.                
  10.                 mov cx, 8
  11.         s:        mov al, [bx]
  12.                 add al, es:[bx]
  13.                 mov ss:[bx], al
  14.                 inc bx
  15.                 loop s
  16.                
  17.                 mov ax,4c00h
  18.                 int 21h
复制代码

code ends
end start

(6)
程序如下,编写code段中的代码,用push指令将data段中的前8个字型数据,逆续存储到stack段中。
assume cs:code
data segment
        dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
data ends
stack segment
        dw 0,0,0,0,0,0,0,0
stack ends
code segment
  1. start:        mov ax, data
  2.                 mov ds, ax
  3.                 mov ax, stack
  4.                 mov ss, ax
  5.                 mov sp, 16
  6.                
  7.                 mov bx, 0
  8.                 mov cx, 8
  9.         s:        push [bx]
  10.                 add bx, 2
  11.                 loop s
  12.                
  13.                 mov ax, 4c00h
  14.                 int 21h
复制代码

code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-18 22:48:38 From FishC Mobile | 显示全部楼层
本帖最后由 ms1234 于 2022-8-18 23:32 编辑

好的,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 15:35:06 | 显示全部楼层
我发现个问题,没有assume的段是放在一个段中的,也就是说abc的段都是一样的,不同的是偏移地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 23:54:29 | 显示全部楼层
能解释下(2)-4的答案么?N是字节数而不是段地址,除以16后加1是加的什么?还有乘以16是为啥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-25 01:31:44 | 显示全部楼层
本帖最后由 tyyfly 于 2024-4-2 17:52 编辑
就当我没说 发表于 2024-2-6 23:54
能解释下(2)-4的答案么?N是字节数而不是段地址,除以16后加1是加的什么?还有乘以16是为啥


我的答案不完全正確,(N/16+1)*16,當中N/16是取商然後+1,再乘16是因為一個段的最小單位是16個字節,即便N不足16,內存中開的空間還是16字節。
但我沒考慮到N=16的情況,按照我的答案,若N等於16時,就會開到2個段,也就是32個字節了(白白浪費16個字節)。
因此更好的答案應該是((N+15)/16)*16,即便N=16,開的內存單元也會是16個字節。

(N/16+1)*16
=(N/16+16/16)*16
=((N+16)/16)*16
此時N=16時會多開一個段,浪費空間,因此要讓N=16時不開下一個段,就讓前面在N=16的倍數時不進位即可。
所以得
((N+15)/16)*16

另外,感謝大哥指點錯誤
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-20 00:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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