一、1.汇编指令、寄存器和寻址方式

立即数:可以立即在一条机器指令后找到具体数值的数,如内存中00位写着加指令,01位写着1100_1111,意思就是将1100_1111(十进制207)加到某处,反之可以表示数据的地址。

请添加图片描述

低端字节序:16位寄存器数据存入内存(内存单位为8位),寄存器低位存入内存低位(如00)高位存入内存高位(如01),内存到寄存器同样

请添加图片描述

程序的重定位难题:当内存中的数据因为某种情况需要移动时,只是简单地将内存地址(绝对内存地址)写到指令中就不行了,会导致重定位错误。

为了解决重定位问题,使用[段地址:偏移地址]来描述数据的地址

请添加图片描述

此时如果发生内存数据的移动(以段为单位进行移动),只需要改变段地址的内容,就还可以定位到数据(有点像C中的宏定义)

8086的分段机制:有两个寄存器CS和DS,分别存放代码段和数据段的具体段地址,但是内存地址提供了20根地址线,而两个段寄存器只有16位(如CS可表示0XAB12,而内存地址却为0XAB120)。将内存地址右移4位(吞掉末位的那个0)来存入段寄存器,取出时再左移4位(补上末位0),这样段地址就存入了寄存器,再通过指针指令寄存器IP表示偏移地址,[CS:IP]表示出代码地址

因此对于一个数据,可以由多个段+偏移来表示

请添加图片描述

Notepad++集成nasm编译:运行 -> 运行 -> 输入cmd /k pushd “KaTeX parse error: Expected 'EOF', got '&' at position 22: …NT_DIRECTORY)" &̲ E:\NASM\nasm.e…(FULL_CURRENT_PATH)” -o “$(NAME_PART).bin” & PAUSE & EXIT 保存 -> 设置快捷键

8086内存地址分配:

请添加图片描述

请添加图片描述

8086加电复位时处理器向内存发出的指令是FFFF0,距离内存结束只有16字节,这16字节存放有跳转指令,在跳转的目的地,一般会把磁盘的0头0柱1扇区(主引导扇区)的数据加载到那里,以此执行对应的程序。

填充主引导扇区的512字节来作为初始程序,若不满足512字节,则不识别,同时,必须以0XAA55结尾

mov ax, 0x30
mov dx, 0xc0
add ax, dx

times 510-($-$$) db 0 ;$为当前地址,$$为汇编文件开始的段地址,($-$$)表示本行的段内偏移量,填充0
dw 0xaa55

标号:汇编代码由三个可选的部分组成 标号-指令-注释,标号表示离他最近的下一指令的地址

上段代码等效于

start:
	mov ax, 0x30
    mov dx, 0xc0
    add ax, dx
current:
    times 510-(current-start) db 0
    dw 0xaa55

逻辑块地址:物理上磁盘分为柱面-磁头-扇区(CHS),但是表示困难,所以采用逻辑块地址(LBA)的方式表示,即对每个扇区编号

请添加图片描述

请添加图片描述

屏幕显示文字:显存中存放屏幕显示的相关内容数据,显存映射到内存的地址中

请添加图片描述

请添加图片描述

请添加图片描述

mov ax, 0xb800
mov ds, ax

mov byte [0x00], 'l' ;向显存映射到内存的地方写数据,默认在ds表示的段中写
mov byte [0x01], 0x02;0x01只是偏移地址,无法确定操作的位数,0x04同样可以理解为0x0004,无法确定位数,所以需要加byte指定以字节进行mov
;如果操作数之一确定了操作的位数(如固定位数的寄存器)则不需要指定位数
mov byte [0x02], 't'
mov byte [0x03], 0x02

mov byte [0x04], 'y'
mov byte [0x05], 0x02
;mov指令不允许在内存单元之间直接传输数据

times 510-($-$$) db 0
dw 0xaa55

使用nasm xxx.asm -l xxx.lst生成汇编代码的列表文件,方便观察汇编后数据和代码的对应关系

请添加图片描述

汇编地址:每条指令在程序汇编阶段确定的地址

段间直接绝对跳转指令:jmp 段地址:偏移地址如设置jmp 0x0000:0x7c00则将跳转至主引导扇区开头重新执行

请添加图片描述

mov ax, 0xb800
mov ds, ax
...
jmp 0x0000:0x7c00+$ ;段间直接绝对跳转指令,使处理器卡在本行程序 

times 510-($-$$) db 0
dw 0xaa55

绝对间接近跳转:使用寄存器对绝对偏移地址进行间接存储,只能在CS表示的当前段内跳转

mov ax, 0xb800
mov ds, ax
...
mov bx, 0x7c00+again
again:
	jmp bx 

times 510-($-$$) db 0
dw 0xaa55

使用相对偏移量的短/近跳转:使用标号

mov ax, 0xb800
mov ds, ax
...
again:
	jmp again ;近跳转用jmp short 8位跳转相对偏移量,远跳转用jmp near 16位跳转相对偏移量,不加自动识别

times 510-($-$$) db 0
dw 0xaa55

无符号除法:

  • 操作数8位(除数)-被除数16位:AX ÷ 操作数 = AL···AH
  • 操作数16位(除数)-被除数32位:DX_AX ÷ 操作数 = AX···DX
  • 操作数32位(除数)-被除数64位:EDX_EAX ÷ 操作数 = EAX···EDX(8086不支持,80386开始支持)
  • 操作数64位(除数)-被除数128位:RDX_RAX ÷ 操作数 = RAX···RDX(8086和32位处理器不支持,6位处理器支持)
mov ax, 0xffff
mov bx, 10

mov cx, 0
mov ds, cx

;除5次bx,从而取出单个数字,存入内存
xor dx, dx
div bx
add dl, 0x30
mov [0x7c00+buffer], dl

xor dx, dx
div bx
add dx, 0x30
mov [0x7c00+buffer+1], dl

xor dx, dx
div bx
add dx, 0x30
mov [0x7c00+buffer+2], dl

xor dx, dx
div bx
add dx, 0x30
mov [0x7c00+buffer+3], dl

xor dx, dx
div bx
add dx, 0x30

;ds标识结果各数字段(0x0000)es标识显存段(0xb800)
mov cx, 0xb800
mov es, cx

mov [es:0x00], dl
mov byte [es:0x01], 0x02

mov dl, [0x7c00+buffer+3]
mov [es:0x02], dl
mov byte [es:0x03], 0x02

mov dl, [0x7c00+buffer+2]
mov [es:0x04], dl
mov byte [es:0x05], 0x02

mov dl, [0x7c00+buffer+1]
mov [es:0x06], dl
mov byte [es:0x07], 0x02

mov dl, [0x7c00+buffer]
mov [es:0x08], dl
mov byte [es:0x09], 0x02

buffer:
	db 0, 0, 0, 0
	
jmp 0x0000:0x7c00+$

times 510-($-$$) db 0
dw 0xaa55

串传送指令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3wILzQV-1691295231112)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230729144708214.png)]

jmp start
text:
	db 'l', 0x02, 't', 0x02, 'y', 0x02

start:
	mov ax, 0x7c0 ;本段物理地址为0000:7c00,即7c00,当ds取0000时必须标号前加7c00,当ds取07c0时0偏即7c00,汇编地址即物理地址,标号前不用加7c00
	mov ds, ax
	
	mov ax, 0xb800
	mov es, ax
	
	cld ;设定传送方向为低地址向高地址(标志寄存器清零),反之为std(标志寄存器置位)
	mov si, text ;原始位置偏移地址
	mov di, 0 ;目标位置偏移地址
	mov cx, (start-text)/2 ;控制重复执行movsw几次
	rep movsw
jmp $
times 510-($-$$) db 0
dw 0xaa55

循环

number:
	db 0, 0, 0, 0, 0
start:
    mov ax, number
    mov bx, ax
    mov si, 10 ;除数
    mov cx, 5 ;控制循环次数
lab:
	xor dx, dx
	div si
	mov [bx], dl ;bx又叫基址寄存器,可用来寻址
	inc bx ;自增,dec自减
	loop lab
jmp $
times 510-($-$$) db 0
dw 0xaa55

请添加图片描述

求补码:neg 寄存器或内存地址

请添加图片描述

有符号除法指令:idiv 除数,除适用有符号数外,同无符号除法

余数的符号始终与被除数相同

标志寄存器:

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

使用栈进行数位分解并显示

xor cx, cx
mov ss, cx ;栈的段地址0x0000
mov sp, cx ;栈顶初始地址0x0000,每次入栈sp减2(16位,2字节),高地址向低地址移动

mov bx, 10
xor cx, cx
; 分解数位
lab:
	inc cx ;记录入栈次数
	xor dx, dx
	div bx
	add dl, 0x30
	push dx ;入栈,16位处理器出入栈必须16位
	cmp ax, 0 ;判断ax是否被除完
	jne lab
	
show:
	pop dx
	mov [es:di], dl
	inc di
	mov byte [es:di], 0x02
	inc di
	loop show
	

就像[BX]直接表示DS段内存相应偏移量下内容一样,使用[BP]直接表示SS段内存的值

mov bp, sp
mov dx, [bp+2]

请添加图片描述

几种寻址方式:

  • mov ax, cx两个操作数都是寄存器寻址
  • add bx, 0xf000右操作数是立即数寻址,标号会直接编译成地址,所以也是立即数寻址
  • 内存寻址
    • mov ax, [es:0x50c0]右操作数是直接(内存)寻址
    • inc word [ss:bx+2]使用基址寻址
    • mov [si+lab], dx用SI或DI进行内存寻址(DS段),变址寻址
    • mov ax, [bx+si+0x03]基址变址寻址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现数字加密

Java实现数字加密 需求分析代码实现小结Time 需求分析 1.首先,考虑方法是否需要接收数据处理? 需要一个4位数,至于是哪一个数,让方法的调用者传递。 所以,方法的参数,就是这个需要加密的四位数 2.接着&…

nsqd的架构及源码分析

文章目录 一 nsq的整体代码结构 二 回顾nsq的整体架构图 三 nsqd进程的作用 四 nsqd启动流程的源码分析 五 本篇博客总结 在博客 nsq整体架构及各个部件作用详解_YZF_Kevin的博客-CSDN博客 中我们讲了nsq的整体框架,各个部件的大致作用。如果没看过的&…

【websocket - Tornado】简易聊天应用

1、背景 项目测试的过程中需要自己搭建一个webscoket站点,确保此类服务接入后台系统后访问不受影响。python的服务框架常用的有Flask、Django、Tornado,每个框架的侧重点不同,导致使用的场景就会有所差异。 Flask轻量级,采用常规的同步编程方式,需要安装其他模块辅助,主…

Pytest测试框架2

目录: pytest参数化用例pytest标记测试用例pytest设置跳过、预期失败用例pytest运行用例pytest测试用例调度与运行pytest命令行常用参数python执行pytestpytest异常处理 1.pytest参数化用例 参数化 通过参数的方式传递数据,从而实现数据和脚本分离。…

并网逆变器学习笔记6---三电平SVPWM下的连续和不连续调制

之前在学习中总结过一次DPWM策略选择:并网逆变器学习笔记5---三电平DPWM 但是对于三电平逆变器而言,如何从连续调制切换到不连续调制,存在一些疑惑点,下午闲来无事,把SVPWM下的连续调制和不连续调制的开关状态选择&am…

MyCat核心概念、需求案例讲解、环境准备及分片配置

1.MyCat概念介绍 2.MyCat入门需求 2.1 需求分析 2.2 环境准备 输入以下命令检查服务器防火墙状态 dead代表关闭状态,如果不关闭也可以需要开放特定的端口号!! systemctl status firewalld接着需要在三台服务器上的MySQL上创建三个数据库db0…

(树) 剑指 Offer 36. 二叉搜索树与双向链表 ——【Leetcode每日一题】

❓ 剑指 Offer 36. 二叉搜索树与双向链表 难度:中等 输入一棵二叉搜索树,将该二叉搜索树转换成一个 排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为…

相机传感器格式与镜头光圈参数

相机靶面大小 CCD/CMOS图像传感器尺寸(sensor format)1/2’‘、1/3’‘、1/4’实际是多大 1英寸——靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。 2/3英寸——靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。 1/2英寸——靶面尺寸为宽6.…

SSE技术和WebSocket技术实现即时通讯

文章目录 一、SSE1.1 什么是SSE1.2 工作原理1.3 特点和适用场景1.4 API用法1.5 代码实现 二、WebSocket2.1 什么是WebSocket2.2 工作原理2.3 特点和适用场景2.4 API用法2.5 代码实现 三、SSE与WebSocket的比较 当涉及到实现实时通信的Web应用程序时,两种常见的技术选…

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成…

每天五分钟机器学习:梯度下降算法和正规方程的比较

本文重点 梯度下降算法和正规方程是两种常用的机器学习算法,用于求解线性回归问题。它们各自有一些优点和缺点,下面将分别对它们进行详细的讨论。 区别 1. 梯度下降算法是一种迭代的优化算法,通过不断迭代调整参数来逼近最优解。它的基本思想是根据目标函数的梯度方向,沿…

openGauss学习笔记-32 openGauss 高级数据管理-批处理模式

文章目录 openGauss学习笔记-32 openGauss 高级数据管理-批处理模式32.1 语法格式32.2 参数说明32.3 示例 openGauss学习笔记-32 openGauss 高级数据管理-批处理模式 openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。 以下场景建议使用批…

测试人员简单使用Jenkins

一、测试人员使用jenkins干什么? 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL:填写git地址 2.填写开发分支,测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时,开发人员可以通过…

【各个突破】Echart的象柱形图数值为0时,图像发生严重偏移,一招即可解决

【各个突破】Echart的象柱形图数值为0时,图像发生严重偏移,一招即可解决 1,问题描述2,解决方法3,最终结果 1,问题描述 当数值是0亩时,圆形图标发生位置偏移,据悉,该bug是…

掌握 JVM 调优命令

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是:首先通过 jps 命令查看当前进程,然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数,通过 jstat 命令查看 cla…

漫画 | TCP/IP之大明邮差

后记: 1973年,卡恩与瑟夫开发出了网络中最核心的两个协议:TCP协议和IP协议,随后为了验证两个协议的可用性,他们做了一个实验,在多个异构网络中进行数据传输,数据包在经过近10万公里的旅程后到达…

git删除已经提交的大文件

当你不小心把一个巨大的二进制文件提交到git仓库的时候,此时删除再提交也没有用了,大文件已经在仓库中留底了。另外比如需要删除某个需要保密的文件,都是相同的解决办法。 我本来想着把dll放在三方库里面提交到仓库里,省得在不同…

STM32 低功耗-待机模式

STM32 待机模式 文章目录 STM32 待机模式第1章 低功耗模式简介第2章 待机模式简介2.1 进入待机模式2.1 退出待机模式 第3章 待机模式代码部分总结 第1章 低功耗模式简介 在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止和待机模式。 在系统或…

【九】mybatis 缓存模块设计

mybatis 缓存模块设计 简介:MyBatis提供了一级缓存和二级缓存,其中一级缓存基于SqlSession实现,而二级缓存基于Mapper实现。这里我们就来学习一下MyBatis缓存的使用,并分析MyBatis缓存的实现原理。 首先我们找到缓存模块的源码&a…