博客
关于我
汇编语言-运行程序
阅读量: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 segment 和 codesg ends 是一对成对使用的伪指令,它们用于定义一个段codesg,分别表示段的开始和结束。一个汇编程序通常由多个段组成,这些段用于存放代码、数据或作为栈空间。

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

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

程序的返回功能通过 mov ax, 4C00H 和 int 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/

    你可能感兴趣的文章
    Python:假与 0
    查看>>
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>