汇编网首页登录博客注册
hygf99的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏
友情链接

[2010-01-24 23:53] 《汇编语言》第六章实验5

(1)将下面的程序编译连接,用DEBUG加载、跟踪,然后回答问题:
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA   SEGMENT
       DW 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
DATA   ENDS
STACK  SEGMENT
       DW 0,0,0,0,0,0,0,0
STACK  ENDS
CODE   SEGMENT
START: MOV AX,STACK
       MOV SS,AX
       MOV SP,16
       MOV AX,DATA
       MOV DS,AX
       PUSH DS:[0]
       PUSH DS:[2]
       POP DS:[2]
       POP DS:[0]
       MOV AX,4C00H
       INT 21H
CODE   ENDS
END    START
①cpu执行程序,程序返回前,DATA段中的数据为多少?
0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
②cpu执行程序,程序返回前,CS=(0B53H),SS=(0B52H),DS=(0B51H)
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为(X-2H),STACK段的段地址为(X-1H)。


(2)将下面的程序编译连接,用DEBUG加载、跟踪,然后回答问题:
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA   SEGMENT
       DW 0123H,0456H
DATA   ENDS
STACK  SEGMENT
       DW 0,0
STACK  ENDS
CODE   SEGMENT
START: MOV AX,STACK
       MOV SS,AX
       MOV SP,16
       MOV AX,DATA
       MOV DS,AX
       PUSH DS:[0]
       PUSH DS:[2]
       POP DS:[2]
       POP DS:[0]
       MOV AX,4C00H
       INT 21H
CODE   ENDS
END    START
①cpu执行程序,程序返回前,DATA段中的数据为多少?
0123H,0456H
②cpu执行程序,程序返回前,CS=(0B53H),SS=(0B52H),DS=(0B51H).
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为(X-2H),STACK段的段地址为(X-1H)。
④对于如下定义的段:
NAME SEGMENT
.........
NAME ENDS
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(此处答案上是 (N/16+1)*16,我实在不知道为什么)。


(3)将下面的程序编译连接,用DEBUG加载、跟踪,然后回答问题:
ASSUME CS:CODE,DS:DATA,SS:STACK
CODE   SEGMENT
START: MOV AX,STACK
       MOV SS,AX
       MOV SP,16
       MOV AX,DATA
       MOV DS,AX
       PUSH DS:[0]
       PUSH DS:[2]
       POP DS:[2]
       POP DS:[0]
       MOV AX,4C00H
       INT 21H
CODE   ENDS
DATA   SEGMENT
       DW 0123H,0456H
DATA   ENDS
STACK  SEGMENT
       DW 0,0
STACK  ENDS
END    START
①cpu执行程序,程序返回前,DATA段中的数据为多少?
0123H,0456H
②cpu执行程序,程序返回前,CX=(0B51H),SS=(0B55H),DS=(0B54H).
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为(X+3H),STACK段的段地址为(X+4H)。


(4)如果将1、2、3题中的最后一条伪指令“END START”改为“END”(也就是说,不指明程序的入口),则哪个程序仍然可以正常执行?请说明

原因。
第三个程序仍能够正常执行。因为1、2中,数据和栈在前,cpu先执行这些不正确的“指令”导致错误。3的代码在数据和栈前面,故可以正常

执行。


(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,C
       MOV ES,AX
       MOV BX,0
       MOV CX,8
     S:MOV AL,[BX]
       ADD ES:[BX],AL  ;一颗种子一个坑,撒好第一遍了
       ADD BX,1
       LOOP S
       MOV AX,B
       MOV DS,AX
       SUB BX,BX
       MOV CX,8
     S0:MOV AL,[BX]
       ADD ES:[BX],AL  ;再撒一遍,一个个对应相加
       ADD AL,1
       LOOP S0
       MOV AH,4CH
       INT 21H

CODE   ENDS
END    START


(6)程序如下,编写CODE段中的代码,用PUSH指令将A段中WORD数据,逆序存储到B段中。
ASSUME CS:CODE
A      SEGMENT
       DW 1,2,3,4,5,6,7,8
A      ENDS
B      SEGMENT
       DW 0,0,0,0,0,0,0,0
B      ENDS
CODE   SEGMENT
START:

       MOV AX,B
       MOV SS,AX
       MOV SP,10H
       MOV AX,A
       MOV DS,AX
       MOV BX,0
       MOV CX,8
     S:PUSH [BX]
       ADD BX,2
       LOOP S
       MOV AH,4CH
       INT 21H
       

CODE   ENDS
END    START
评论次数(5)  |  浏览次数(1103)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2010-10-02 22:26  ]

④对于如下定义的段: 
NAME SEGMENT 
......... 
NAME ENDS 
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(此处答案上是 (N/16+1)*16,我实在不知道为什么)。
-------
一个段占用的空间是16的整数倍,最小空间为16
所以一个数据大小为N(N本身不一定是16的倍数)的段,实际大小应为(N/16+1)*16

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码