2018-11-02

2018-11-02  本文已影响0人  JakeFishYao

[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
上一篇下一篇

猜你喜欢

热点阅读