【8086汇编】第一个程序

目录

  • [1. 前置知识](#1. 前置知识)
    • [1.1 环境配置及调试运行(以vscode为例)](#1.1 环境配置及调试运行(以vscode为例))
    • [1.2 debug如何调试](#1.2 debug如何调试)
  • [2. 源程序到可执行程序](#2. 源程序到可执行程序)
    • [2.1 源程序](#2.1 源程序)
    • [2.2 编译链接图解](#2.2 编译链接图解)
    • [2.3 程序的基本框架](#2.3 程序的基本框架)
    • [2.4 程序编译](#2.4 程序编译)
  • [3. BX寄存器](#3. BX寄存器)
  • [4. loop循环指令](#4. loop循环指令)

1. 前置知识

汇编语言的文件后缀名是.asm

1.1 环境配置及调试运行(以vscode为例)

  1. 下载vscode软件
  2. 下载插件
  3. 配置插件

    下载好后,启用MASM/TASM扩展,点击它右下角的设置--->扩展设置--->选择MASM--->(DOS模拟器建议dosbox)

  4. 新建文件,后缀名为.asm,编写代码。
  5. 运行:右击鼠标,选择运行
  6. 调试:右击鼠标,选择"调试当前程序",会弹出一个黑框框,在里面调试即可

1.2 debug如何调试

命令:

p:程序正常结束

q:退出调试

exit:退出debug界面

2. 源程序到可执行程序

步骤:

(1)源程序编辑 文本编辑器 汇编语言源文件.asm文件

(2)源程序汇编 masm.exe或ml.exe 目标文件.obj文件

(3)目标文件链接 link.exe .exe

(4)可执行文件调试 debug.exe .exe

历程:

2.1 源程序

简单程序说明:

  1. 伪指令(格式)

    xxx segment end

    xxx ends

    assume

  2. 指令 (代码段)

  3. 标号(可自定义)

    codesg

伪指令



end

assume

标号

结束

2.2 编译链接图解

2.3 程序的基本框架

框架:各种段构成,存放数据、代码、栈空间等等

如:编程运算2^3

  1. 定义一个段,名称为abs

    asm 复制代码
    abc segment   ;定义一个段,名称为abs
    ......
    abc ends
  2. 在这个段中写入汇编命令,来实现任务

    asm 复制代码
    abc segment
    	mov ax, 2   ;写入汇编命令
    	add ax, ax
    	add ax, ax
    
    	mov ax, 4c00H
    	int 21H
    abc ends
  3. 指出程序在何处结束

    asm 复制代码
    abc segment
    	mov ax, 2
    	add ax, ax
    	add ax, ax
    
    	mov ax, 4c00H
    	int 21H
    abc ends
    
    end  ;程序在此处结束
  4. abc被当作代码段来用,所以应该和abc和cs联系起来

    asm 复制代码
    assume cs:abs  ;abc和abc和cs联系起来
    abc segment
    	mov ax, 2
    	add ax, ax
    	add ax, ax
    
    	mov ax, 4c00H
    	int 21H
    abc ends
    
    end

2.4 程序编译

  1. 若使用下载的masm软件,则cmd打开终端,进入masm目录下

    • 输入:masm 要编译的asm文件路径,生成obj文件
    • obj文件在masm的安装目录下生成
    • 再输入:link obj文件名,可以生成对应的exe程序(64位电脑会不兼容,需要挂载到其他盘符上)解决masm在64位windows版本不兼容无法运行
  2. 用vscode插件,直接右键调试即可

    t命令:每次执行一条汇编指令

    当下一条指令为int 21H时,需要P命令表示程序结束。

3. BX寄存器

mov ax, 0是将ds:0000处开始的内容送入ax。

[0]表示一个内存单元,0是偏移地址,段地址默认ds,而长度由具体指令中的其他操作对象如寄存器指定。

bx的默认段寄存器也是ds

如:

mov ax, bx

mov al, bx

因为某些原因,我们使用"()"来表示一个寄存器或内存单元中的内容,如(ax)表示ax的内容,(20000H)表示内存。

4. loop循环指令

loop指令格式:loop 标号

CPU执行loop时,要进行两步操作:

  1. (cx)=(cx)-1
  2. 判断cx中的值,不为0则跳到标号处执行,为0则向下执行。

loop做循环指令,cx放循环次数。

asm 复制代码
assume cs:code

code segment
	mov ax, 2
	
	mov cx, 11
s:  add ax, ax
   loop s

	mov ax, 4c00h
	int 21h

code ends
end 


注意0和0在masm中的混淆:

在debug中,mov ax,0没有问题,但是在masm中会被当做mov ax,0处理。

解决:mov ax, 0

  1. 将0先放入bx中,再mov ax, bx
  2. 写出默认寄存器:mov ax, ds:0
相关推荐
学逆向的16 小时前
汇编——寻址方式
开发语言·汇编·网络安全
我不是QI17 小时前
Master PDF Editor 逆向复现
汇编·安全·pdf
执迷不悟8236 天前
ARM--汇编指令
汇编·arm开发
Dlrb12118 天前
ARM指令集---汇编指令集的学习与应用:C程序与汇编的相互调用,处理器工作模式的改变等
汇编·arm开发·arm··arm指令集·汇编指令
学逆向的10 天前
汇编——函数
开发语言·汇编·网络安全
学逆向的10 天前
汇编——修改EIP的值
开发语言·汇编·网络安全
学逆向的13 天前
汇编——数据存储模式
开发语言·汇编·网络安全
学逆向的14 天前
汇编——内存
开发语言·汇编·算法·网络安全
学逆向的15 天前
汇编——位运算
开发语言·汇编·算法·网络安全
hai31524754315 天前
九章编译法----空间几何统一编译法
网络·汇编·人工智能·线性代数