<汇编语言(第2版)>2011032701

源代码:

assume cs:codesg

codesg segment
    mov ax ,0123h
    mov bx ,0456h
    add ax ,bx
    add ax ,ax
   
    mov ax ,4c00h
    int 21h
codesg ends

end

分析:
汇编语言中有两种指令:
汇编指令:对应机器码
伪指令:没有对应的机器码,由编译器识别,不被CPU执行

上述代码中的伪指令有:
1、
XXX segment
    .
    .
    .
XXX ends

segment和ends是一对成对使用的伪指令,功能用来定义一个段,segment说明一个段开始,ends说明一个段结束。
一个段必须有一个名次来标识,格式如下:
段名 segment
    .
    .
    .
段名 ends

一个汇编程序是由多个段组成,这些段用来存放代码、数据或当作栈空间来使用。
一个有意义的汇编程序至少要有一个段,来存放代码。


2、
end是一个汇编程序的结束标记

3、
assume,含义"假设",将有特定用途的段和相关的段寄存器关联起来。
代码中:
assume cs:codesg标识codesg段和cs段寄存器关联

除了伪指令外,还有标号,
如codesg,一个标号指代了一个地址

这里还有程序返回的概念
就是一个程序结束后,将cpu控制权交还给其他得以运行的程序的过程

代码中:
mov ax,4c00h
int 21h

就是实现程序返回的功能。

关于为什么使用这个int 21h来实现,在于Dos系统中断的定义,其中AH=4Ch,AL=0就定义了21H中断的4C功能,就是带返回码结束,参考地址http://blog.csdn.net/wongson/archive/2009/01/01/3679884.aspx

利用Debug命令来调试,注意Dos的PSP=程序段前缀(PSP)-资料来源:

http://course.cug.edu.cn/21cn/%CE%A2%D0%CD%BC%C6%CB%E3%BB%FA%BC%BC%CA%F5/content/masm/chapter4/4-4/4-4-4.htm

【摘抄】

程序段前缀PSP
    DOS运行程序时,需要该程序的一系列参数(如,程序结束地址、Ctrl_Break处理程序的地址、出错处理地址等),另外还需要一个磁盘读、写的缓冲区,这个参数区和缓冲区,称为"程序段前缀(PSP)"。 PSP共有256字节,它是运行程序时,由DOS自动在内存中建立的。 PSP的结构下图所示:


注意:
  (
1)、PSP起始两字节存放"INT 20H"指令的机器码(CDH 20H),该指令使程序返回DOS;
  (2)、EXE程序刚运行时,DS和ES指向PSP首址,即INT20H指令的机器码:COM程序刚运行时,DS,ES,CS,SS均指向PSP首址。

  在PSP结构中,我们只关心前两个字节,它是指令"INT 20H"的机器码(CDH、20H)。

原文地址:https://www.cnblogs.com/GoGoagg/p/1996788.html