2018-11-02

[TOC]


L4 第一个程序

源程序包含的内容

伪指令

伪指令由编译器来执行,没有实际的意义。

  1. segment与 ends:
    功能是定义一个段
XXX segment
`
`
`
XXX ends
  1. end:
    汇编结束的标记

  2. assume:
    将有特定用途的段和相关的段寄存器及窜起关联恰里。

源程序与程序

源程序:源程序文件中所有内容
程序:计算机执行,处理的指令或数据

编译与链接

用masm与link程序来用

masm 1.asm;//编译
link 1.obj;//链接
1.exe//执行

ml 1.asm;

谁将可执行文件中的程序装在进入内存并使它运行?

dos是一个单任务操作系统

在dos中,可执行文件中的程序p1要运行,必须有一个正在运行的程序p2,将p1从可执行文件中加载入内存,将CPU的控制权交给它,p1才能得以运行;当p1运行完毕后,应该将CPU的控制权交还给使它得以运行的p2。

cmd 其实是一个command.exe程序

在cmd中加载p1,然后程序返回。
command设置CPU的CS:IP指向程序的第一条指令。

程序返回:将CPU返回给加载他的程序

一个汇编程序从写到执行的过程

编程->1.asm->编译->1.obj->连接->1.exe->加载->运行->CPU

程序被装在内存的什么地方呢?

在dos中,exe加载过程

[图片上传失败...(image-23709c-1541149932450)]
1. 计算机会找到一段起始地址为SA:0000(即起始地址的偏移地址为0)的容量足够的空闲内存区
(不会怕内存不够大,因为cx已经加载了程序的大小)
cx 中储存的程序的长度 (000Fh->15个机器码)
2. 在这段内存区中前256个字节存放的是PSP;
PSP是dos用来和程序进行通讯的内容

3. 这段内存的256字节处开始(在PSP后),将程序装入,程序地址被设为SA+10H:0;
地址
PSP区域:SA:0
程序区:SA+10H:0
(PSP区与程序区虽然物理地址连续,却有不同的段地址。)
4. 该内存的段地址存入ds中,出事话其他相关寄存器后,设置CS:IP指向程序入口
DS与IP相差0010H:0

  DS = SA
  CS = SA+10H

debug.exe中的指令

u:查看命令

u 0x21:0 
u 0x21:0 256


t来执行指令
p来执行int 21(不用会跳到其他地方)
r可以用来改变

t
t
p
r ip
:0

附上一段汇编代码可以观察 ax,bx用pop,push

assume cs:codesg

codesg segment
        mov ax,2000h
        mov ss,ax
        mov sp,0
        pop ax
        pop bx
        push ax
        push bx
        pop ax
        pop bx

        mov ax,4c00h
        int 21h

codesg ends
end
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容