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

我的博客

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

[2011-09-15 10:27] 汇编语言 实验五 包含多个段的程序

(1) 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题.
assume cs:code, ds:data ,ss:stack

data segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  ;dw 即define word ,定义字型数据。
data ends

stack segment
        dw 0,0,0,0,0,0,0,0 ;定义8个字型,用作栈空间。
stack ends

code segment
start: mov ax,stack ;这里的stack就是栈的ss段地址。
        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


1 CPU执行程序,程序返回前,DATA段中的数据是:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h.
2 CPU执行程序,程序返回前,CS=13D7,SS=13D8,DS=13D5.
3 设程序加载后,code段的段地址为X,则data段的段地址为:x-2,stack段的段地址为:x-1.

(2) 将下面的程序编译连接,用DEBUG加载,跟踪,然后回答问题.
assume cs:code, ds:data ,ss:stack

data segment
        dw 0123h,0456h  ;dw 即define word ,定义字型数据;db即defing byte定义字节型数据.
data ends

stack segment
        dw 0,0   ;定义2个字型,用作栈空间。
stack ends

code segment
start: mov ax,stack ;这里的stack就是栈的ss段地址。
        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        
1 CPU执行程序,程序返回前,data段中的数据为:23,01,56,04.
2 CPU执行程序,程序返回前,CS=13DB,SS=13DA,DS=13D9.
3 设程序加载后,code段的段地址为X,则data段的段地址为:X-2,Stack段的段址为:X-1.
4 对于如下定义的段:
    name segment
    ...
    name ends
如果段中的数据占N个字节,则程序加载后,该段的实际占有的空间为:N<=16B,则为16个字节,N>16,则为16的倍数. 即如果N=20,则实际占用空间为:32B.
(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
1 CPU执行程序,程序返回前,data段中的数据为:23,01,56,04,0,...
2 CPU执行程序,程序返回前,CS=13D9,SS=13DD,DS=13DC.
3 设程序加载后,code段的段地址为X,则data段的段地址为:x+3,stack的段地址为:X+4.
(4) 如果将1,2,3题中的最后一条指令"end start"改为"end",则哪上程序仍然可以执行:第三题,因为,代码段在其它段的最前面,也就是说加载程序后,CS:IP指的就是代码段.无需程序入口,可正确执行.

(5) 程序如下,编写CODE代码段中的代码,将a段和b段中数据依次相加,将结果存到C段中.
ssume 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,b
        mov es,ax

        mov ax,c
        mov ss,ax
        mov sp,0008h
        
        mov bx,0
        mov cx,4

  s:    mov ax,ds:[bx]
        mov dx,es:[bx]
        add ax,dx
        inc bx
        inc bx        
        push ax
        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,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 
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,0010h
                
        mov bx,0
        mov cx,8

  s:    push ds:[bx]
        inc bx
        inc bx        
        loop s

        mov ax,4c00h
        int 21h
code ends
end start


综上所述:我发现在多个段的程序中段地址在不同的段都是以16的倍数而来.
评论次数(0)  |  浏览次数(601)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码