zoukankan      html  css  js  c++  java
  • <汇编语言(第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)。

  • 相关阅读:
    appium 环境安装windows
    解决windows7无法连接CentOS7系统中oracle问题:ORA-12514 TNS 监听程序当前无法识别
    linux系统(CentOS7)虚拟机上安装oracle 11g,解决oracle图形界面卡住无法点击next问题
    python自动化测试框架学习
    VSCode + GDBServer 远程调试C/C++流水账
    IDEA 16注册
    VS2008非托管C++调用wcf(WebService)服务
    python 从数据库表生成model
    2015年工作总结
    dlib库学习之一
  • 原文地址:https://www.cnblogs.com/GoGoagg/p/1996788.html
Copyright © 2011-2022 走看看