精华内容
下载资源
问答
  • 8086汇编
    千次阅读
    2021-01-19 15:14:19

    1、基础指令

    1.1、MOV 指令

    将逗号前的寄存器中的值修改为逗号后寄存器的值、内存的值或指定的值

    语法:

    mov [寄存器], [需要放入的值]
    

    示例:

    mov ax, 100
    

    将 100 赋值到 ax 寄存器

    也可以将一个寄存器中的值赋值到另一个寄存器

    mov bx, 100 ; 将100赋值到bx
    mov ax, bx ; 将bx中的值赋值到ax中
    

    也可以将内存中的值赋值到寄存器中

    mov ax, 2000H ; 将段地址先储存到ax中
    mov ds, ax ; 设置段地址
    mov bx, 1000H ; 将偏移地址储存到bx中,以便引用
    
    mov ax, [bx] ; 将段地址为2000,偏移地址为1000的内存中的值赋值到ax中
    mov ax, ds:[bx] ; 效果同上
    mov ax, ds:[1000H] ; 效果同上
    

    在源码中,不可以直接使用 [0] 来表示偏移地址,必须引用其他寄存器中的值,或者使用 ds:[0] 这种格式。

    1.2、使用 idata

    可以在程序中使用 idata 更方便的定位到指定的偏移地址

    示例:

    mov ax, [bx+10]
    mov ax, [bx+si+10]
    

    可以在设置偏移地址的方括号中使用运算

    1.3、操作符 PTR

    一般在执行计算时,指令后的寄存器会默认指定计算的值是字数据还是字节数据。例如:add al, sp:[0]add ax, sp:[0] ,但是在一些特殊情况下,编译器无从得知需要计算的数是字数据还是字节数据,此时,就需要操作符 ptr 来指定数据类型。

    语法:

    [指令] [word/byte] ptr [操作]
    

    示例:

    inc word ptr sp:[0] ; 以字为单位将指定内存中的数据自加
    

    1.4、操作符 OFFSET

    取得对应标号的偏移地址

    示例:

    s:mov ax, offset s ; 将标号s所处的偏移地址复制到ax寄存器中
    

    2、计算指令

    2.1、ADD 加法

    将第二个值和第一个寄存器中的值相加,并放入第一个寄存器中,用法同 mov

    语法:

    add [寄存器], [需要相加的值]
    

    2.2、 SUB 减法

    减法运算,用法同 add 指令

    示例:

    sub ax, 10
    

    2.2、INC 自增& DEC 自减

    自增,将指定的值加一。

    语法:

    inc [寄存器]
    inc [内存地址]
    

    自减,将指定的值减一

    语法:

    dec [寄存器]
    dec [内存地址]
    

    2.3、AND 与运算

    逻辑与指令,将两个值进行逻辑与计算

    1 and 1 = 1
    0 and 1 = 0
    1 and 0 = 0
    0 and 0 = 0
    

    语法:

    and [寄存器、内存地址], [寄存器、内存地址]
    

    示例:

    and ax, bx
    

    2.4、OR 或运算

    逻辑或云端,将两个值进行逻辑或计算

    1 or 1 = 1
    0 or 1 = 1
    1 or 0 = 1
    0 or 0 = 0
    

    语法:

    or [寄存器、内存地址], [寄存器、内存地址]
    

    示例:

    or ax, bx
    

    2.5、 MUL 乘法

    对指定数值进行乘法计算

    • 8位的值进行相乘时结果在 ax 中,乘数默认在 al
    • 16位的值进行相乘时 dx 中为高位 ax 中为低位,乘数默认在 ax

    2.6、 DIV 除法

    除法指令 division 对寄存器的值进行除法运算。

    • 当除数为字节型数据时,执行 div 指令后
      • ax 寄存器中的值会被作为被除数
      • 结果:
        • al 中为结果的商
        • ah 中为余数
    • 当除数为字型数据时
      • dxax 中的值会拼接到一起作为一个双字型数据作为被除数,即 (dx)*10000h+(ax)
      • 结果:
        • ax 中为商
        • dx 中为余数

    示例:

    assume cs:code
    
    code segment
    start:mov ax, 4d00h
    	mov dx, 25h ; 设置被除数为 254d00
    	mov bx, 7d0h ; 设置除数为 7d0
    	div bx
    	
    	mov ax, 4c00h
    	int 21h
    code ends
    end start
    

    在这里插入图片描述

    3、转移指令

    3.1、循环 LOOP

    3.1.1、单循环

    使用此指令可以跳转到指定的代码开始循环,若寄存器 cx 的值为0时则继续执行,若不为0时则会跳转到指定的代码进行循环,循环一次完成后会将 cx 中的值减一。

    语法:

    s:[代码段]
    [代码...]
    loop s ; 跳转到标号为 s 的代码上继续执行
    

    loop 是否执行是判断 cx 中值,所以在使用 loop 时一定要将 cx 中的值保存处理。

    3.1.2、多层循环

    在多层循环的情况下,所有的 loop 指令使用的都是 cx 的值,所以在执行内层循环时需要将 cx 的值进行保存复原操作。

    此操作可以使用寄存器和内存来实现,寄存器由于数量有限而且易被覆盖,而独立的内存地址在多个循环嵌套的情况下容易混淆,故使用栈来暂存复原 cx 的值。

    格式:

    assume cs:code, ss:stack
    
    stack segment
    	dw 0,0,0,0,0,0,0,0
    stack ends
    
    code segment
    start:mov ax, stack
    	mov ss, ax
    	mov sp, 10h
    	mov cx, 10 ; 设置外层循环次数
    	s0:[...do something...]
    	push cx ; 保存外层循环次数
    	mov cx, 20 ; 设置内层循环次数
    	s1:[...do something...]
    	loop s1
    	pop cx ; 复原外层循环次数
    	loop s0
    	
    	mov ax, 4c00h
    	int 21h
    code ends
    

    3.2、 JUMP 无条件转移指令

    jump 为无条件转移,可以只修改 ip ,也可以同时修改 csip

    跳转需要的两种信息

    • 转移的目的地址
    • 转移的距离
      • 段间转移
      • 段内短转移
      • 段内近转移

    3.2.1、偏移距离转移

    语法:

    jmp [标号]
    

    示例:

    assume cs:code
    
    code segment
    start:mov ax, 1111h
    	jmp s
    	mov ax, 2222h
    	s:mov ax, 3333h
    	
    	mov ax, 4c00h
    	int 21h
    code ends
    end start
    

    此指令使用的数据位为8位,所以跳转的极限位置为 -128~127 超出此区域会发生错误。

    使用位移的方式确定跳转的地址时,无论这段代码放置在内存的任何位置,都可以正常执行。

    3.2.2、段地址偏移地址转移

    语法:

    jmp far ptr [标号]
    

    示例:

    assume cs:code
    
    code segment
    start:mov ax, 0
    	mov ax, 11h
    	jmp far ptr s ; 此跳转指令编译后为 JMP 076E:010B
    	db 256 dup (0)
    	s:add ax, 1
    	
    	mov ax, 4c00h
    	int 21h
    code ends
    end start
    

    这种格式的跳转指令是直接改变 csip 寄存器中的值,从而实现远距离跳转。

    3.2.3、使用寄存器和内存中的地址转移

    直接使用寄存器或内存中储存的内容作为 ip 寄存器的值进行跳转

    语法:

    • 寄存器
    mov ax, 0123h
    jmp ax
    
    • 内存
    jmp word ptr ds:[12]
    
    • 实现段间跳转
    jmp dword ptr ds:[12]
    

    段间跳转使用的的是双字型数据,指定 内存单元地址ip 的值, 内存单元地址+2 的数据为 cs 寄存器的值。

    3.3、 JCXZ 条件转移指令

    根据条件:若寄存器 cx 的值为0,则跳转到指定标号的代码段,若 cx 不为0则继续向下执行。

    格式:

    jcxz short [标号]
    

    4、栈段指令

    4.1、入栈 PUSH

    将指定的数据压入栈底,sp 寄存器中储存的内容是栈底的指针,值为栈底的偏移地址。

    语法:

    push [寄存器、内存地址、数据]
    

    示例:

    push ds:[bx]
    

    4.2、出栈 POP

    将栈顶的数据出栈到指定的寄存器或内存中

    语法:

    pop [寄存器、内存地址]
    

    示例:

    pop ds:[bx]
    

    在使用栈段进行入栈出栈操作时,一定要先设置好 sp 寄存器的值。

    5、伪指令

    指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。

    5.1、变量定义

    5.1.1、 db 指令

    定义一个字节长度的数据

    db 10,20
    

    5.1.2、 dw 指令

    定义两个字节长度的数据,也称为字型变量

    dw 0123h,0234h
    

    5.1.3、 dd 指令

    定义四个字节长度的数据,也称为双字型变量

    dd 123,234
    

    5.2、 DUP 定义多个变量

    使用 dup 伪指令可以同时定义多个变量

    格式:

    [db/dw/dp] [需要生成的数量] dup ([值],..)
    

    示例:

    dw 3 dup (0) ; 同 dw 0,0,0
    dw 3 dup (0,1) ; 同 dw 0,1,0,1,0,1
    

    6、寄存器

    6.1、寄存器

    • AX,BX,CX,DX 数据寄存器:

      • AX (Accumulator):累加寄存器,也称之为累加器

      • BX (Base):基地址寄存器

      • CX (Count):计数器寄存器

      • DX (Data):数据寄存器

      • 以上四个寄存器都可以分为两个8位的寄存器,例如 ax 可以分为 alah

    • SP 和 BP 指针寄存器:

      • SP (Stack Pointer):堆栈指针寄存器
      • BP (Base Pointer):基指针寄存器
    • SI 和 DI 变址寄存器:

      • SI (Source Index):源变址寄存器
      • DI (Destination Index):目的变址寄存器
    • 只有 bx,bp,si,di 可以放在 [] 中进行寻址操作。并且只可以存在四种组合 bx,si bx,di bp,si bp,di
    • [] 寻址时使用 bp 并且没有显式给出段地址,段地址默认在 ss

    6.2、段寄存器

    • CS (Code Segment):代码段寄存器;

    • DS (Data Segment):数据段寄存器;

    • SS (Stack Segment):堆栈段寄存器;

    • ES (Extra Segment):附加段寄存器;

    7、函数调用

    7.1、 CALL 指令

    用于和 ret 指令配合时间函数调用和返回,用法与 jmp 指令类似实现代码的跳转,但在跳转前会将 csip 中的值 push 到栈中以用于程序返回。

    语法:

    call [标志位]
    call [word/dword] ptr [内存地址] 
    

    7.2、 RETRETF 指令

    用于将 csip 寄存器返回到原来的地址,ret 命令会执行 pop ipretf 命令则会执行 pop cspop ip 两条命令。

    语法:

    ret
    ;-------
    retf
    

    7.3、将 CALLRET 配合使用

    示例:

    assume cs:code, ss:stack
    
    stack segment
    	db 16 dup(0) ; 用来存储 cs 和 ip 的值
    stack ends
    
    code segment
    start:mov ax, stack
    	mov ss, ax
    	mov sp, 16
    	call s ; 调用 s 代码段,实现函数调用
    	
    	mov ax, 4c00h
    	int 21h
    	
    	s:mov ax, 0
    	add ax, 10h
    	ret ; 返回到 call 命令后,实现函数返回
    code ends
    end start
    

    8、标志寄存器指令

    8.1、 ADC 指令

    adc 指令用于在计算时将 CF 标志寄存器的值也进行带入运算,可以用来实现更多位数的数据运算,使用格式与 add 相同。

    格式:

    adc [寄存器], [数值/寄存器/内存]
    

    示例:

    adc ax, 10
    

    公式 (ax)+10+(cf)

    使用 adc 指令计算 1EF000H201000H 的值:

    assume cs:code
    
    code segment
    start:
    	mov ax, 001eh ; 第一个数的高位
    	mov bx, 0f000h ; 第一个数的低位
    	add bx, 1000h ; 将低位相加,进位保存到CF中
    	adc ax, 20h ; 两数高位和CF中的进位相加
    	; 结果 ax 中为高位 bx 中为低位
    	
    	mov ax, 4c00h
    	int 21h
    code ends
    end start
    

    8.2、 SBB 指令

    sbb 指令用法与 adc 指令相同,此指令用户两数相减再减去 cf 标记寄存器中的值。

    示例:

    sbb ax, bx
    

    公式: (ax)-(bx)-(cf)

    8.3、 CMP 指令

    此指令功能相当于减法指令,但是不保存结果只会影响标志寄存器的值。其他指令通过识别被影响的标志寄存器来得知比较结果。

    格式:

    cmp [操作对象1], [操作对象2]
    

    示例:

    mov ax, 8
    mov bx, 3
    cmp ax, bx
    

    执行后:

    ax不变
    ZF=0
    PF=1
    SF=0
    CF=0
    OF=0
    

    通过此指令可以判断标志寄存器的值来确定两个数的大小关系

    a 为值1,b 为值2

    • ZF 若为1则表示两个数相等
    • ZF 若为0则表示两个数不相等
      • OF 若为0,没有溢出
        • SF 为1,表示 a<b
        • SF 为0,表示 a>b
      • OF 为1,有溢出
        • SF 的含义正好和表达的相反

    8.4、条件转移指令

    指令含义检测内容
    je等于转移ZF=1
    jne不等于转移ZF=0
    jb低于转移CF=1
    jnb不低于转移CF=0
    ja高于转移CF=0&ZF=0
    jna不高于转移CF=1orZF=1

    8.5、串传送指令

    每次执行指令 SI,DI 寄存器都会根据 DF 标志位进行相应的增减。

    • ((es)*16+di)=((es)*16+si)
    • 如果 DF=0
      • 增加 SI,DI
    • 如果 DF=1
      • 减少 SI,DI

    串传送指令和 rep 指令进行配合可以实现循环多次复制,循环条件和 loop 指令相同。

    8.5.1、 MOVSB 字节传送

    每次 SI,DI 加一,实现正向复制。

    示例:

    assume cs:code,ds:data
    
    data segment
    	db 'hello world'
    	db 11 dup (0)
    data ends
    
    code segment
    start:
    	mov ax, data
    	mov ds, ax
    	mov si, 0
    	mov es, ax
    	mov di, 11
    	mov cx, 11
    	
    	cld
    	rep movsb
    	
    	mov ax,4c00h
    	int 21h
    code ends
    end start
    

    结果:

    在这里插入图片描述

    8.5.2、 MOVSW 字传送

    效果同 movsb 指令,movsw 传送的为字型数据。

    8.6、修改 DF 标志位

    设置 DF 标志:

    cld ; 将DF设置为0
    std ; 将DF设置为1
    

    8.7、 PUSHF & POPF

    将标志寄存器中的数据进行入栈和出栈,用法同 pushpop 指令。

    更多相关内容
  • 8086汇编工作环境.rar

    2020-02-28 21:31:45
    8086汇编工作环境.rar 8086汇编工作环境.rar 8086汇编工作环境.rar 086汇编工作环境.rar 8086汇编工作环境.rar 8086汇编工作环境.rar
  • 汇编语言课程设计《可弹奏的音乐盒》,附规范格式完整文档及8086汇编源码。 内容包含:中断、文件读写、音乐播放、自由弹奏、显示输出、曲谱显示
  • 8086汇编语言编写点歌系统: 输入不同的数字,播放相应的音乐。其中“1”代表《刚好遇见你》音乐,“2”代表《成都》音乐,“3”代表《暧昧》音乐。输入数字“0”,则退出点歌系统。
  • 8086汇编工作环境.zip

    2019-06-26 22:54:55
    DOSBox是一个软件。它是当前在 Windows 系统运行 DOS 游戏的较为完美的解决方案,该软件不仅能支持相当多的游戏实现正常运行,而且能将声音完美表现出来。
  • 8086汇编语言数组排序

    2018-12-18 17:32:44
    找了好多地方没有找到,自己写一个汇编语言实现的数组排序。
  • 模拟器会在虚拟 PC 中执行程序,这可以隔绝你的程序,避免它去存取实际硬件,像软盘、硬盘、内存,而在虚拟机器上执行汇编程序,这可以让除错变得更加容易。 这个软件完全兼容于 Intel 的下一代处理器,包括了 ...
  • emu8086汇编的软件

    2018-07-16 13:26:17
    emu8086,方便编写汇编语言_(:з」∠)_ ,欢迎大家下载啊
  • 8086汇编语言工作环境

    2017-02-03 09:03:50
    提供学习8086汇编语言程序设计的极简解决方案。DOSBox0.74-win32-installer.exe是DOS模拟器,masm.exe汇编、link.exe连接、Debug.exe调试,edit.com和edlin.com是两个编辑程序。
  • 微机
  • 8086汇编:输入输出和数组操作的一些函数
  • 组装项目 用Intel 8086汇编语言编写的程序
  • 没错就是万恶的8086汇编. 介绍不知道怎么写,随便贴一段代码吧.懂得人也大概知道这是大概什么样的了
  • 8086汇编

    2017-07-03 20:32:18
    8086汇编 masm汇编器 带图形界面
  • 8086 汇编 练习 软件

    2018-05-10 20:13:39
    8086 汇编 练习 软件 可仿真,练习汇编编程,也可以下载烧录
  • 简介: 本书共分三部分。第一部分是实验的预备知识,介绍了汇编语言程序运行时所需要的一些应用程序;第二部分是实验题目,分为基本实验六个和选做实验四个;第三部分给出了实验程序参考清单,供读者参考。
  • 8086汇编语言程序设计实验指导书8086汇编语言程序设计实验指导书8086汇编语言程序设计实验指导书8086汇编语言程序设计实验指导书
  • win10环境下8086汇编工具集,里面主要包含:dosbox0.74-win32-installer, debug, link(连接工具),edit(编辑器),masm(汇编工具)。这是一份很全面的8086汇编学习工具,走过路过不要错过呦~~~
  • 8086汇编入门知识

    2022-02-18 16:11:04
    8086汇编入门知识 1.8086汇编的基本框架 DATA SEGMENT ;数据定义区,这里面用来定义汇编中的数据 DATA ENDS ;数据段定义结束,所有数据都在数据段或者附加段定义 CODE SEGMENT ASSUME CS:CODE,DS:DATA ;声明将数据...

    8086汇编入门知识


    1.8086汇编的基本框架

    DATA SEGMENT 
    	;数据定义区,这里面用来定义汇编中的数据
    DATA ENDS
    ;数据段定义结束,所有数据都在数据段或者附加段定义
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA	;声明将数据段和代码段分别绑定到指定段寄存器,伪指令仅仅声明,实际没绑定,CS是OS系统自动绑定,DS,ES,SS使用户手动绑定
    标号1:
    	MOV AX,DATA
    	MOV DS,AX	;这两条语句是将DS指向DATA,使DATA称为数据段
    	;段寄存器指向谁谁就是什么段
    	
    	;这里面写汇编代码
    	
    	;将DOS执行权返回给OS,因为DOS是单用户单任务的OS
    	MOV AH,4CH
    	INT 21H 		;这两句是DOS功能调用,返回OS控制权给OS
    CODE ENDS			;代码段结束
    	END 标号1		  ;汇编程序结束,注这里的标号1就是开头的标号1
    

    2.8086的模拟器DOSBox

    1. 将MS-DOS根目录挂载到自己指定的目录下 – 为了把以后编写的代码放到自己执行的目录下

      方法1:

      • 打开DOSBox

      在这里插入图片描述

      • 每次开启都使用挂载命令

        命令1:mount 虚拟磁盘 真实磁盘根目录下的文件夹
        命令2: 虚拟磁盘:   (切换到虚拟磁盘)
        注意:
        	虚拟磁盘并不存在,可以随便弄,只要你将自己随便想的虚拟磁盘挂载到真实磁盘根目录下文件夹,这个虚拟磁盘就相当于诞生了,他的存储位置就是你挂载的真实目录上,对这个磁盘操作就是对真实磁盘的目录操作
        
        eg:创建一个虚拟盘D盘,并将其挂载到Windows 10下的D:\huibianwenjia下
        mount d d:\huibianwenjianjia
        d:    -- 这个命令是切换到D盘下,就是进入到win10的d盘下的huibianwenjianjia
        
        以后代码放到d:\huibianwenjianjia这里
        
        这种方法缺点:
        	每次DOSBox开启都要重新输入命令,麻烦
        

      2.方法2 - — Windows10,其他的系统都一样,不会的私我

      • 找到 ----- dosbox-0.74.conf 配置文件,一般在DOSBox安装目录下

      • 找到文件的最下面加上下面两句话,以后再开启DOSBox的时候,就会自动执行了,不用每次都手动挂载了

        #自动挂载,并且切换到挂载的虚拟磁盘上
        mount D D:\huibianwenjiajia
        D:								
        

      在这里插入图片描述

    2. DOSBox工具的使用Windows10

      • 编译汇编程序的步骤—()表示中间步骤

        1.先编译.asm文件,(使用masm 文件名.asm)—>(生成目标代码文件.obj)

        2.—>链接需要的所有目标代码文件,(使用link 文件名1.obj,文件名2.obj,…)—>生成可执行文件.exe

        3.---->输入:文件名.exe,执行程序 或者 调试 文件名.exe

        总结:编译--------->链接-------->执行/调试

      • 汇编工具 masm.exe

        使用方法:

        编写的汇编文件,使用.asm后缀,
        eg:我编写了b.asm文件--调用2号功能输出字符串到显示屏
        

        b.asm

        DATA SEGMENT
        	STR DB 'HAPPY NEW YEAR',0AH,0DH,'$'
        DATA ENDS
        
        CODE SEGMENT
        	ASSUME CS:CODE,DS:DATA
        START:
        	MOV AX,DATA
        	MOV DS,AX
        	
        	MOV BX,OFFSET STR
        	MOV CX,17
        	
        NEXT:
        	MOV DL,[BX]
        	MOV AH,02H
        	INT 21H
        	INC BX
        	LOOP NEXT
        	
        	MOV AH,4CH
        	INT 21H
        	
        CODE ENDS
        	END START
        

        operation usage:

        masm b.asm
        

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQdnZwcs-1645171840665)(C:\Users\15796\Pictures\日常截图\b.png)]

      • 链接工具 link.exe

        链接目标代码
        link b.obj
        

      在这里插入图片描述

      • 执行 b.exe

        在这里插入图片描述

      • 调试工具 debug.exe

        调试b.exe:debug b.exe
        -u:反汇编,这里会发现一些伪指令根本没有编译,没有产生目标代码
        通过反汇编命令可以看到数据段,代码段,堆栈段,附加段,首地址
        我这个程序的代码段地址为:076C,数据段首地址为:076A
        代码段的地址是由OS决定的,我们不可以干预
        -r:查看寄存器
        -g:运行程序
        -t:单步执行程序,单步调试程序前应该使用-g命令执行程序
        -q:退出调试
        -p:退出调试
        -d:查看内存空间
        usage:-d 地址空间首址:偏移值
        

        命令演示:

      在这里插入图片描述
      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述


    展开全文
  • 配置8086汇编环境

    2021-01-18 21:23:46
    由于王爽老师的这本书时间比较久了,本文就介绍如何使用dosbox配置8086汇编学习环境 本人的环境:maxOS Catalina 10.15.7 当然了如果是学习汇编现有机器的性能是绝对够的 下载Dosbox 首先搜索dosbox,去官网下一个...

    终于放假了,花了大约一星期的时间来学习王爽老师的《汇编语言》一书,以此提升自己对底层知识的理解,当然,阅读的过程是择重进行的,一些内容不敢说完全掌握。

    由于王爽老师的这本书时间比较久了,本文就介绍如何使用dosbox配置8086汇编学习环境

    本人的环境:maxOS Catalina 10.15.7

    当然了如果是学习汇编现有机器的性能是绝对够的

    下载Dosbox

    首先搜索dosbox,去官网下一个匹配版本:

    https://www.dosbox.com/

    image-20210117232949569

    image-20210117233006153

    由于是dos系统模拟器,所以只有11MB,安装过程可以说没有难点。

    修改配置文件

    安装完成后,其实就可以启动Dosbox了,不过此时模拟器还没有找到本地的硬盘,显示Z:

    我们需要把想要挂载的位置挂载到dosbox上面

    比如:~/assembly目录挂载到C盘,这样我们就可以使用了

    dos系统下挂载命令如下:

    > mount c /Users/dzzhyk/assembly
    > c:
    

    这样就把本地的/Users/dzzhyk/assembly目录挂载到了dosbox上的C盘,就可以在dosbox模拟器里面访问本地内容了。

    每次启动dosbox都需要执行这两行代码,比较麻烦,因此将这两句话添加到dosbox的启动命令里面,Mac上的具体方法如下:

    找到 /Users/dzzhyk/Library/Preferences/DOSBox 0.74-3-3 Preferences 文件,在文件最后添加如下内容:

    [autoexec]
    # Lines in this section will be run at startup.
    # You can put your MOUNT lines here.
    mount c ~/assembly
    c:
    

    image-20210117234135134

    这样就不用每次都挂载目录到C盘了

    获取8086汇编工具

    8086汇编工具主要有2个:编译器masm和链接器link,这就是汇编语言从源代码到运行所需要的全部内容。

    当然,为了学习方便,还需要一个调试器debug.exe,如果想体验在dos系统下编程的话,还有一个编辑器软件edit.com供你选择,以上共计4件工具,足够我们学习8086汇编知识了。

    这些工具的下载,网上各处都是,在此不赘述,也可以使用博主本人提供的下载:

    https://download.csdn.net/download/weixin_43826242/14504821

    需要知道的dos命令

    既然我们要使用dos系统来学习8086汇编,所以需要掌握一点dos系统的基本命令

    博主在这里总结一下自己常用到的命令:

    命令作用
    dir列出目录内容,类似于ls
    del删除内容,类似于rm,支持通配符
    cd切换目录
    md建立文件夹
    rd删除文件夹
    cls清屏
    copy复制内容

    对于Dos命令,大家只要参考记住就好,毕竟重点不是学习dos系统的使用。

    有用的Dosbox快捷键

    下面是本人学习过程中用到的的dosbox快捷键,熟练使用会比较方便:

    快捷键作用
    Alt + Enter全屏dosbox,复古的感觉让人年轻了20岁
    Ctrl + F4刷新dosbox挂载的本地目录,用于同步更新(常用)
    Ctrl + F10捕捉/释放鼠标

    尝试第一个汇编程序

    最后,一起尝试一个简单的汇编程序生命过程,以此验证环境配置:

    编辑汇编源文件

    无论是使用edit,还是自己新建文件也好,创建测试汇编文件test.asm

    内容如下:

    assume cs:code
    code segment
    start: 	mov ax,01234H
    		mov bx,0abcdH
    		add ax,bx
    code ends
    end start
    

    编译汇编asm文件

    使用编译器masm.exe编译刚创建的汇编文件:

    > masm.exe test.asm;
    

    注意,最后有个分号,告诉编译器不产生中间文件,执行快速编译,编译结果如下:

    image-20210117235951553

    链接汇编obj对象

    使用链接器连接生成的OBJ对象:

    > link.exe test.obj;
    

    注意,最后有个分号,告诉链接器不产生中间文件,链接完成后就生成了可执行的exe文件:

    image-20210118000151957

    这里会警告没有设置栈段,对于现在无须理会

    使用debug调试exe

    执行如下命令,使用debug调试一个汇编程序:

    > debug.exe test.exe
    

    回车之后就会进入debug里面,开始对test.exe进行调试:

    image-20210118000408327

    这里输入r,展示寄存器状态:

    image-20210118000434403

    可以看到,当前指令停在了我们编写的第一条mov指令上面

    输入t单步执行指令,观察AX寄存器变化,可以看到指令正确执行:

    image-20210118000532611

    继续使用t执行指令,最终得到add指令结果,存放在AX寄存器中:

    image-20210118000612649

    使用q,退出debug

    image-20210118000655357

    到此,成功运行了一个简单的汇编程序,也证明我们的8086汇编环境搭建成功了。

    常用的debug命令

    博主本人总结的debug常用命令:

    指令作用实例
    d查看内存单元内容-d 1000:0
    r查看各个寄存器的内容,修改寄存器的值-r ax 1000
    e修改内存的值-e 1000:0 41 42 43 44 45
    u以汇编指令的形式查看内存区域-e 1000:0
    t执行CS:IP指向的指令-t
    a以汇编指令的形式填充内存区域-a 1000:0
    p执行通过当前程序段,可以跳出循环-p
    q退出debug.exe-q
    g执行到某一个内存位置的指令处-g 0016
    展开全文
  • 汇编专业任意选修课的一些例子大全,8086汇编,值得本科生参考
  • 8086汇编语言仿真软件

    2012-11-27 11:03:02
    emu8086汇编语言仿真软件,是学习汇编语言居家必备之良品,你值得拥有!
  • 8086汇编语言程序设计

    2017-12-11 09:50:22
    8086汇编语言程序设计,各种寻址方式讲得很清楚,可作为电子书随时查阅
  • 8086汇编dos工具

    2021-08-30 14:56:07
    8086汇编dos工具
  • EMU8086汇编仿真工具

    2022-03-24 23:44:55
    EMU8086汇编仿真工具
  • android上玩8086汇编

    2017-04-20 07:49:53
    在安卓手机上编写8086汇编程序,很神奇吧?这里给出完整解决方案。下载资源,配合http://blog.csdn.net/sxhelijian/article/details/70254393中的讲解,玩吧!
  • 8086汇编语言程序设计–已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数 DATAS SEGMENT BUF DB 12,-12,13,-13,1,2 COUNT DB ? DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS ...

    1. 8086汇编语言程序设计–已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数

    DATAS SEGMENT
        BUF DB 12,-12,13,-13,1,2
        COUNT DB ?
    DATAS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS
    START:
        MOV AX,DATAS
        MOV DS,AX
        
        MOV CX,6	;循环控制次数
        LEA BX,BUF	;设置缓冲区指针
        XOR DL,DL	;统计计数器清零
    NEXT:
    	MOV AL,[BX]	;取数据
    	ADD AL,0	;做运算,影响标志
    	JS NEGA		;是负数,转移
    	INC DL		;是正数,统计加1
    NEGA:
    	INC BX		;移动指针
    	LOOP NEXT	;循环控制
    	MOV COUNT,DL;保存统计结果
        
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    

    验证结果:
    请添加图片描述
    可以看到DX的值为0004,刚好是4个正数

    2. 8086汇编语言程序设计:bubble sort

    DATAS SEGMENT
        BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20
        N = ($-BUF)/2
    DATAS ENDS
    
    STACKS SEGMENT
        DB 200 DUP (0)
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        
        MOV CX,N
        DEC CX
        
    LOOP1:
    	MOV DX,CX
    	MOV BX,0
    LOOP2:
    	MOV AX,BUF[BX]
    	CMP AX,BUF[BX+2]
    	JGE L
    	XCHG AX,BUF[BX+2]
    	MOV BUF[BX],AX
    L:
    	ADD BX,2
    	DEC CX
    	JNE LOOP2
    	MOV CX,DX
    	LOOP LOOP1
    	
        
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    

    最后,BUF中的内容应为:
    在这里插入图片描述
    通过调试界面,可以看出从14(20的十六进制)开始:
    在这里插入图片描述

    3. 8086汇编程序设计:求字符串中的最大的ASCII码值,并在内存单元中显示

    DATAS SEGMENT
        BUF DB 'sherlockjjobs'
        MAX DB ?
        COUNT EQU $-BUF
    DATAS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS
    START:
        MOV AX,DATAS
        MOV DS,AX
        
    	MOV MAX,0
    	LEA SI,BUF
    	MOV AX,0
    READS:
    	MOV AL,[SI]
    	CMP SI,COUNT
        JGE FINAL
    	CMP AL,MAX
    	JG BIGGER
        JMP LOOP1
    BIGGER:
        MOV MAX,AL
    LOOP1:
    	INC SI
    	JMP READS
    FINAL:
    	MOV AL,MAX
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    

    4. 8086汇编程序设计:将128位数右环移

    CODES SEGMENT
        ASSUME CS:CODES
        NUM DB 00H
        	DB 10H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
        	DB 00H
    
    START:
    	PUSH CS
    	POP DS
    	PUSH CS
    	POP ES
    	LEA SI,NUM
    	
        MOV AL,[SI+15]
        MOV CX,3
        
    LOOP1:
    	CALL RIGHTSHIFT
    	LOOP LOOP1
    	
    	
    	MOV [SI+15],AL
        MOV AH,4CH
        INT 21H
        
    RIGHTSHIFT PROC
    	RCR AL,1
     	RCR BYTE PTR[SI],1
    	RCR BYTE PTR[SI+1],1
    	RCR BYTE PTR[SI+2],1
    	RCR BYTE PTR[SI+3],1
    	RCR BYTE PTR[SI+4],1
    	RCR BYTE PTR[SI+5],1
    	RCR BYTE PTR[SI+6],1
    	RCR BYTE PTR[SI+7],1
    	RCR BYTE PTR[SI+8],1
    	RCR BYTE PTR[SI+9],1
    	RCR BYTE PTR[SI+10],1
    	RCR BYTE PTR[SI+11],1
    	RCR BYTE PTR[SI+12],1
    	RCR BYTE PTR[SI+13],1
    	RCR BYTE PTR[SI+14],1
    	RCR BYTE PTR[SI+15],1
    	RET
    RIGHTSHIFT ENDP
        
        
    CODES ENDS
        END START
    
    展开全文
  • 8086汇编语言精华笔记总结~

    千次阅读 多人点赞 2020-07-09 20:17:30
    目录汇编语言笔记总结第一章 汇编语言的基础知识1、计算机系统概述2、汇编语言介绍3、数据表示4、8086微处理器1、通用寄存器2、标志寄存器FLAGS3、指令指针IP4、段寄存器5、8086寻址方式1、指令的组成2、8086的机器...
  • 大学学的嵌入式,但是汇编、计组,操作系统的课逃了很多没,勉强混个及格,工作10年了现在回过头去发现这几门课非常重要,以前怎么没好好学呢?所以决定沉下心来把这两门课补回来。说句实在点的话,确实什么时候开始...
  • 8086汇编_除法指令

    2022-04-10 13:57:17
    文章目录语法规则16位除法32位除法 语法 div m 规则 16位除法 除数m为8位时 默认ax存储被除数 商保存在al中 余保存在ah中 32位除法 除数m为16位时 默认ax存储被除数低16位,dx存储被除数高16位 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,449
精华内容 8,179
关键字:

8086汇编