博客
关于我
汇编语言-运行程序
阅读量: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/

    你可能感兴趣的文章
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>