博客
关于我
汇编语言-运行程序
阅读量:418 次
发布时间:2019-03-06

本文共 1465 字,大约阅读时间需要 4 分钟。

汇编语言-一个程序

程序从写出到执行

源程序

在汇编语言源程序中,包含两种指令:汇编指令和伪指令。汇编指令是有对应的机器码,可以被编译为机器指令,由CPU执行;而伪指令没有对应的机器码,不直接被CPU执行,而是由编译器处理。

以下是示例汇编程序的代码:

assume cs:codesgcodesg segment    mov ax, 0123H    mov bx, 0456H    add ax, bx    add ax, ax    mov ax, 4C00H    int 21Hcodesg endsend

codesg segmentcodesg ends 是一对成对使用的伪指令,它们用于定义一个段codesg,分别表示段的开始和结束。一个汇编程序通常由多个段组成,这些段用于存放代码、数据或作为栈空间。

end 是汇编程序的结束标记,编译器在遇到 end 时会停止编译。在编写程序时,应在程序结尾处加上 end,否则编译器无法识别程序的结束位置。

assume 伪指令的作用是假设某一段寄存器和程序中的某一个用 segment...ends 定义的段相关联。编译器根据 assume 指令将段寄存器与指定段联系起来。

程序的返回功能通过 mov ax, 4C00Hint 21H 实现。以8086 CPU为例,开机后运行的Command控制台在运行程序时会将控制权交给程序,程序运行结束后会返回控制权给Command。关于这两条指令如何实现控制权的返回,会在之后的章节详细说明。

编译和链接源程序

当你写好程序后,将其保存为 file.asm 文件,然后通过 masm 编译器编译,编译器会将代码编译成 obj 文件。接着进行链接操作,使用 link file.obj 命令即可生成 exe 文件。

在2021年,重新实现8086 CPU并不现实。以下是一些可以替代的方法:

  • emu8086:集成无需控制指令,提供完整的图形化界面。
  • DOSbox:仿 DOS界面,具体操作可参考相关文档。
  • 执行程序

    在 DOSbox 中,链接出 exe 文件后,直接输入文件名即可运行(无需输入 exe 后缀)。如果需要调试程序,可以使用 debug file.exe(文件全名)。

    在命令控制台中执行程序时,程序会被加载到内存中,CPU的控制权交给程序,程序运行结束后又会返回控制权给初始调用程序。

    调试程序

    调试程序时,需要一个程序去调用目标程序并将控制权交给它。调试过程中,控制权仍然在调试器(如Command)中,无法直接操作程序的命令。通过调试器,可以观察程序在内存中的加载情况和执行过程。

    关于 hello.exe 的调试示例:

    程序加载后,ds 寄存器存放了程序所在内存区的段地址,内存区的偏移地址为 0,因此程序在物理内存中的地址为 SA x 16 + 0

    由于PSP占用 256 字节(100H),程序的物理地址为 SA x 16 + 256,即 SA + 10H:0

    INT21H 指令执行后,会显示 "Program terminated normally",并将控制权返回到调试器(如Debug)。使用 Q 命令退出调试器后,控制权会返回到命令控制台。

    在 DOS 中运行程序时,Command 会加载程序到内存中,程序运行结束后返回到Command。调试时,使用 debug hello.exe 会加载程序到内存中,程序运行结束后返回到Debug,退出调试后再返回到Command。

    转载地址:http://wrgkz.baihongyu.com/

    你可能感兴趣的文章
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>