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

我的博客

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

[2011-08-24 20:14] 第六章检测题及实验。

检测点6·1
(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:
assume cs:coesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:mov ax,[bx]
   mov cs:[bx],ax
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start

(2)(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,完成程序:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0                     ;5个字单元用作栈空间
start:
      mov ax,cs
mov ss,ax
      mov sp,1ah
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:push [bx]
      pop cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start

实验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
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
-r
AX=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA5  CS=0BA7  IP=0000   NV UP EI PL NZ NA PO NC
0BA7:0000 B8A60B        MOV     AX,0BA6
-t

AX=0BA6  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA5  CS=0BA7  IP=0003   NV UP EI PL NZ NA PO NC
0BA7:0003 8ED0          MOV     SS,AX
-t

DS=0B95  ES=0B95  SS=0BA5  CS=0BA7  IP=0000   NV UP EI PL NZ NA PO NC
0BA7:0000 B8A60B        MOV     AX,0BA6
-t

AX=0BA6  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA5  CS=0BA7  IP=0003   NV UP EI PL NZ NA PO NC
0BA7:0003 8ED0          MOV     SS,AX
-t

AX=0BA6  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA6  CS=0BA7  IP=0008   NV UP EI PL NZ NA PO NC
0BA7:0008 B8A50B        MOV     AX,0BA5
-t

AX=0BA5  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA6  CS=0BA7  IP=000B   NV UP EI PL NZ NA PO NC
0BA7:000B 8ED8          MOV     DS,AX
-t

AX=0BA5  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0BA5  ES=0B95  SS=0BA6  CS=0BA7  IP=000D   NV UP EI PL NZ NA PO NC
0BA7:000D FF360000      PUSH    [0000]                             DS:0000=0123
-d0ba5:0 f
0BA5:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............
-
①CPU执行程序,程序返回前,data段中是数据为多少?、
23h,01h,56h,04h,89h,07h,BCh,0Ah,EFh,0Dh,EDh,0Fh,BAh,0Ch,87h,09h
共16字节。
②CPU执行程序,程序返回前,cs=0ba7h,ss=0ba6h,ds=0ba5h
③设程序加载后,code段的段地址为 x,则data段的段地址为x-2,stack段的段地址为x-1。
(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


C:\DOCUME~1\ADMINI~1>debug c:\q.exe
-t

AX=0BA6  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA5  CS=0BA7  IP=0003   NV UP EI PL NZ NA PO NC
0BA7:0003 8ED0          MOV     SS,AX
-t

AX=0BA6  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA6  CS=0BA7  IP=0008   NV UP EI PL NZ NA PO NC
0BA7:0008 B8A50B        MOV     AX,0BA5
-t

AX=0BA5  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA6  CS=0BA7  IP=000B   NV UP EI PL NZ NA PO NC
0BA7:000B 8ED8          MOV     DS,AX
-t

AX=0BA5  BX=0000  CX=0042  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0BA5  ES=0B95  SS=0BA6  CS=0BA7  IP=000D   NV UP EI PL NZ NA PO NC
0BA7:000D FF360000      PUSH    [0000]                             DS:0000=0123
-d 0ba5:0 f
0BA5:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
-
    ①CPU执行程序,程序返回前,data段中的数据为多少?
    23h,01h,56h,04h,0,0,0,0,0,0,0,0,0,0,0,0;共16字节。
    ②CPU执行程序,程序返回前,cs=0ba7h,ss=0ba6h,ds=0ba5h
    ③设程序加载后,code段的段地址为x,则data段的段地址为x-2,stack段地址为x-1       ④对于如下定义的段:
name segment
···
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为: .if (n%16)
 N+{16-[N-(N/16)*16]}
   .else n
(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
C:\DOCUME~1\ADMINI~1>debug c:\q.exe
-t

AX=0BA9  BX=0000  CX=0044  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA5  CS=0BA5  IP=0003   NV UP EI PL NZ NA PO NC
0BA5:0003 8ED0          MOV     SS,AX
-t

AX=0BA9  BX=0000  CX=0044  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA9  CS=0BA5  IP=0008   NV UP EI PL NZ NA PO NC
0BA5:0008 B8A80B        MOV     AX,0BA8
-t

AX=0BA8  BX=0000  CX=0044  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0B95  ES=0B95  SS=0BA9  CS=0BA5  IP=000B   NV UP EI PL NZ NA PO NC
0BA5:000B 8ED8          MOV     DS,AX
-t

AX=0BA8  BX=0000  CX=0044  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=0BA8  ES=0B95  SS=0BA9  CS=0BA5  IP=000D   NV UP EI PL NZ NA PO NC
0BA5:000D FF360000      PUSH    [0000]                             DS:0000=0123
-d 0ba8:0 f
0BA8:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   #.V.............
-
    ①CPU执行程序,程序返回前,data段中的数据为多少?
    23h,01h,56h,04h,0,0,0,0,0,0,0,0,0,0,0,0;共16字节。
    ②CPU执行程序,程序返回前,cs=0ba5h,ss=0ba9h,ds=0ba8h
    ③设程序加载后,code段的段地址为x,则data段的段地址为x+3,stack段地址为x+4     (4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,
不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
只有第(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
code segment
start:mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov ax,c
mob es,ax
xor bx,bx
mov cx,8
s:mov al,ds:[bx]
add al,ss:[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start

    (6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆
序存储到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,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10h
mov cx,8
xor bx,bx
s:push [bx]
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
评论次数(2)  |  浏览次数(377)  |  类型(汇编作业) |  收藏此文  | 

[  tomato   发表于  2011-08-25 09:20  ]

“N+{16-[N-(N/16)*16]} ”这个公式不正确吧。

[  chinatree   发表于  2011-08-25 09:52  ]

(n/16)=商,余数丢弃,
16>=n-(n/16)*16是余数>=0
再拿16减去余数得到的是要补的部分
n+16-[n-(n/16)*16]是16的整倍数,
只是太烦琐了。

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