• 第一个汇编程序


    第一个汇编程序


    1.汇编模拟程序:DOSBox使用

    BOSBox软件常用基本语法:

    mount c: d:\masn 	;挂载磁盘,挂载后用c:切换为C盘才能用debug等工具
    dir 				;查看当前磁盘
    debug 			    ;使用debug工具
    -r 寄存器名			 ;查看cpu寄存器的内容
    -d					;查看内存中的内容  ;扩展用法: -d 段地址:偏移地址 结果偏移地址,如 -d 1000:0 9 代表地址1000:0~1000:9
    -e 内存内容			 ;改写寄存器内存中的内容
    -u 				    ;查看内存中机器码含义
    -T 					;执行内存中的机器码
    -a					;以汇编指令的形式在内存中写入机器指令
    -q					;退出debug工具
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    一点使用细节:

    1. 在使用DOSBox的使用一定要先挂载磁盘,否则无法使用debug工具
    2. 不要直接在自己电脑上使用DOSBox软件,因为你修改的寄存器可能是存储系统文件的寄存器,改了系统就崩了

    伪指令与汇编代码的含义:

    1. 在汇编语言中有两种指令:汇编指令和伪指令
    2. 汇编指令:是指对应的机器码指令,可以被编译为机器指令,最终为CPU执行
    3. 伪指令:是指没有对应的机器指令,最终不被CPU所执行,由编译器执行的执行(编译器根据伪指令来进行相关的编译工作)

    常见的伪指令含义:

    1. assume:这条伪指令含义是"假设"。它假设某一段寄存器和程序中的某一个用segment…ends定义的段相关联

    2. segment与ends:segment和ends是一对成对使用的伪指令。segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段结束。一个段必须有一个名称来表示

    3. end:end是一个汇编语言结束标记,编译器在编译汇编程序的过程中,如果遇到伪指令end,就结束对源程序的编译

    4. idata:表示常量

    5. db:定义字节类型的意思

    6. dw:定义字类型的意思

      比如:

      1. mov ax,[idata] 可以表示 mov ax,[1] mov ax,[2]等
      2. mov bx,idata 可以表示mov bx,1 mov bx,2等
      3. mov ds,idata 可以表示mov ds,1 mov ds,2等但是这样是非法指令,因为ds寄存器不支持直接将数据送入ds寄存器
    ;举例格式
    assume cs:codesg ;assume+自定段名称
    codesg segment ;格式:段名称+segment
        mov ax,0123H
        mov bx,0456H
        add ax,bx
        add ax,ax
        mov ax,4C00H
        int 21H
    codesg ends ;格式:段名称+ends
    end  ;结束标志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.汇编程序从写出到执行的过程

    1. Edit(编写)
    2. masm(编译)
    3. link(连接)

    请添加图片描述

    加载后,CPU的CS:IP指向程序的第一条指令(即程序的入口)

    //1.asm程序
    assume cs:codesg ;将用作代码段的段codesg和段寄存器cs联系起来。
    
    codesg segment ;定义一个段,段的名称为“codesg”,这个段从此开始
    			   ;codesg是一个标号,作为一个段的名称,最终被编译连接成一个段的段地址
    
    	mov ax, 0123H
    	mov bx, 0456H 
    	add ax, bx
    	add ax, ax 
    	
    	mov ax, 4c00H 
    	int 21H ;这两条指令实现程序的返回
    	
    codesg ends ;名称为“codesg”的段到此结束
    
    end ;//编译器在编译汇编程序的过程中,碰到了伪指令end,结束对源程序的编译
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    请添加图片描述

    请添加图片描述


    3.程序执行过程跟踪

    先给结论:DS和CS段之间有256(也就是100H)的通信区,用于DOS跟程序通讯

    这也是为什么(ds)=0B2DH,但程序在0B3D:0(100H就是10:0)处开始执行的原因

    请添加图片描述

    请添加图片描述

  • 相关阅读:
    【GAN入门】生成 AI的概念
    Vue:实现TodoList案例(尚硅谷)
    git的使用(详细教程)通过命令行操作及vscode插件
    【leetcode热题Hot100】——LRU缓存
    ThingsBoard教程(二八):详细讲解在tb平台下 mqtt协议下的 rpc 遥测,客户端rpc,服务的rpc的使用 ,与node-red联动
    win版redis详细安装教程
    guns常用功能整理
    部署百川大语言模型Baichuan2
    一文掌握GitHub Actions基本概念与配置
    Win11快捷键切换输入法无反应怎么办?快捷键切换输入法没有反应
  • 原文地址:https://blog.csdn.net/qq_29678157/article/details/127929227