【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]
相关推荐
老师用之于民1 天前
【DAY30】ARM 架构核心技术详解
汇编·arm
孤独的小丑3 天前
OpenClaw学习资源汇编
汇编·学习
EnglishJun3 天前
ARM嵌入式学习(八)--- 汇编应用:点亮led
汇编·arm开发·学习
2501_918126914 天前
学习所有6502写游戏存档的语句
汇编·嵌入式硬件·学习·游戏·个人开发
2501_918126914 天前
学习所有6502写游戏地图的语句
汇编·嵌入式硬件·学习·游戏·个人开发
2501_918126915 天前
学习所有6502写游戏动画的语句
汇编·嵌入式硬件·学习·程序人生·游戏
2501_918126915 天前
学习所有6502写游戏控制器的语句
java·linux·网络·汇编·嵌入式硬件
2501_918126915 天前
学习所有6502写游戏动作的语句
汇编·嵌入式硬件·学习·游戏·个人开发
2501_918126915 天前
学习所有6502游戏的系统
java·汇编·嵌入式硬件·学习·游戏