【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]
相关推荐
浩浩测试一下2 小时前
汇编常用的(JCC 串 判断)指令 通用寄存器 标志寄存器 段寄存器(逆向分析)
汇编·通用寄存器·逆向二进制·标志寄存器·段寄存器·串 jcc 常用指令
浩浩测试一下1 天前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下1 天前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
浩浩测试一下1 天前
汇编 内联汇编与混合编程 (逆向分析)
汇编·混合编程·windows编程·内联汇编·二进制逆向·c语言混合汇编
浩浩测试一下1 天前
汇编 结构体与宏
汇编··免杀·结构体·windows编程·逆向二进制
浩浩测试一下2 天前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下2 天前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下3 天前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰3 天前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编
浩浩测试一下3 天前
汇编 汇编寻址 (逆向分析)
汇编·寻址·windows编程·二进制逆向·机器码