抄书笔记-汇编语言 第六章 包含多个段的程序

在操作系统的环境中,合法地通过操作系统来获取的空间是安全的,因为操作系统不会让一个程序所用的空间和其他的程序以及系统自己的空间相冲突。

程序获取空间有两种方式:

  • 在加载程序的时候为程序分配
  • 程序在执行的过程向操作系统申请

如果需要一个程序在被加载的时候取得所需要的空间,则必须在源程序中加以说明。

在代码段中使用数据

需求:编程计算下面8个数据的和,结果保存在ax寄存器中

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

程序:

assume cs:code
code segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    
    mov bx,0
    mov ax,0
    
    mov cx,8
    
s:add ax,cs:[bx]
    add bx,2
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end

由于程序前16个字节存放的是数据,实际中,程序开始的地方是cs:ip(偏移16字节),所以在debug中运行的时候需要手工指定程序的开始位置

改进原来的汇编程序,添加程序运行的标志

assume cs:code
code segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    
start:mov bx,0
    mov ax,0    
    mov cx,8
    
s:add ax,cs:[bx]
    add bx,2
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

这里的end除了表示程序结束之外,还告诉程序的入口是start。

可执行文件主要是由描述信息和程序组成,程序源于源程序中的汇编指令和定义的数据;描述信息则主要是编译,连接程序对源程序中相关的伪指令的进行处理。

如上面的end start 在编译连接之后,被转化为一个入口地址,存在可执行文件的描述信息中。当程序被加载到内存之后,加载者从程序的可执行文件的描述信息中读取到程序的入口地址,设置cs:ip

新的程序框架

assume cs:code
code segment
    :
    :
    数据
    :
    :
start:
    :
    :
    代码
    :
    :
code ends
end

在代码段中使用栈

利用程序将下面程序中定义的数据逆序存放

assume cs:codesg
codesg segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    ?
codesg ends
end

实现:

assume cs:codesg
codesg segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:mov ax,cs
        mov ss,ax
        mov sp,30h
        
        mov bx,0
        mov cx,8
    s:push cs:[bx]
        add bx,2
        loop s
        
        mov bx,0
        mov cx,8
    s0:pop cs:[bx]
        add bx,2
        loop s0
        
        mov ax,4c00h
        int 21h
codesg ends
end

6.3将数据,代码,栈放入不同的段

放在一起的主要问题是:

(1)把他们放在一个段里面使程序变得混乱;

(2)如果数据,栈,和代码的大小空间超过64k,就不能放在同一个段里面了。

改进的代码:

assume cs:codesg,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,0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,stack
        mov ss,ax
        mov sp,30h
        
        mov ax,data
        mov ds,ax
        
        mov bx,0
        mov cx,8
    s:push [bx]
        add bx,2
        loop s
        
        mov bx,0
        mov cx,8
    s0:pop [bx]
        add bx,2
        loop s0
        
        mov ax,4c00h
        int 21h
codesg ends
end

在汇编程序,我们定义的代码段是当作指令,还是当作数据,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对cs:ip,ss:sp,ds等寄存器的设置来完成的

共有 0 条评论

Top