• 第一个汇编程序


    第一个汇编程序


    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)处开始执行的原因

    请添加图片描述

    请添加图片描述

  • 相关阅读:
    ubuntu18.04系统android studio 搜索文本快捷键不出来的解决办法
    93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布
    网络安全(黑客)自学
    Python--测试代码
    决策树算法学习笔记
    元数据管理-解决方案调研二:元数据管理解决方案——早期传统解决方案
    MySQL数据库优化总结
    [LINUX使用] iptables && tcpdump && wireshark && tshark
    LabVIEW合并VI
    深度学习跟踪DLT (deep learning tracker)
  • 原文地址:https://blog.csdn.net/qq_29678157/article/details/127929227