汇编学习杂记(14~17章)

[Intel汇编-MASM]端口通信 1. 那些不能被CPU统一编址的芯片:     1) 可以被CPU统一编制的芯片都有一个共同的特点,那就是基本都是存储器(ROM、RAM、显存等)、其上的数据有且仅有CPU有权限读写、速度跟得上CPU,比如硬盘虽然也是存储器、也只能被CPU读写,但是速度太慢容量太大而无法被CPU统一编址到一个逻辑内存空间中;     2) 很多外设(一些I/O设备)的芯片,其上的数据不仅可以被CPU修改,同时 阅读详情

接口芯片和端口 在PC系统的接口卡和主板上,装有各种接口芯片.接口芯片内部有若干寄存器,CPU将这些寄存器当做端口来访问

CPU只能通过端口来对外设进行读写和控制,而外设也是通过端口来和CPU保持联系.

在PC系统中,CPU最多可以定位64K个不同的端口,范围为0 ~ 65535

端口读写指令 只能用 ax 或 al 来存放从端口中读入或发送到端口的数据
访问8位端口(0 ~ 255)时用al,访问16位端口(256 ~ 65535)时用ax
in 读取  in al,00h   in ax,FFFFh   in al,dx
out 写入 out FFh,al  out FFFFh,ax  out dx,al

CMOS RAM 芯片
包含一个实时时钟和一个有128个存储单元的RAM存储器,靠电池供电.
时钟占用 0 ~ 0dh 单元,其余大部分保存系统配置信息,启动时供BIOS读取.
有两个端口 70h 地址端口,存放要访问的单元地址; 71h 数据端口,存放从选定单元中读取的数据,或要写入的数据
例: mov al,2
    out 70h,al  ;将2送入端口70h,表示让71h存放好2号单元的内容
    in  al,71h  ;读出2号单元的内容
    out 71h,al  ;向2号单元写入2

CMOS RAM中的时间信息
存放单元(每个信息长度为1字节): 秒:0  分:2  时:4  日:7  月:8  年:9

存放方式:BCD码  十进制码:  0    1    2    3    4    5    6    7    8    9
             对应的BCD码:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
比如:数值26,表示为0010 0110 (高4位表示十位,低4位表示个位)
内存单元位数是从右到左的(76543210)

shl 逻辑左移指令 (如果位移数大于1,必须存放在cl中,如 shl al,cl)
1.将一个寄存器或内存单元中的数据向左移位
2.将最后移出的一位写入CF中
3.最低位用 0 补充

X逻辑左移一位,相当于执行 X = X*2
如:  00000001 = 1
     00000010 = 2
     00000100 = 4
左移1位相当于乘以[2^1]2,左移2位相当于乘以[2^2]4,左移3位相当于乘以[2^3]8,以此类推

X逻辑右移一位,相当于执行 X = X/2

shr 逻辑右移指令 和shl移动相反,操作步骤一样 (如果位移数大于1,必须存放在cl中)
1.将一个寄存器或内存单元中的数据向右移位
2.将最后移出的一位写入CF中
3.最高位用 0 补充

拆分8位数据中的两个BCD码
mov ah,al          ;假设al中为读出的8位BCD码
mov cl,4
shr ah,cl          ;ah右移4位,便移除了个位的BCD码
and al,00001111b   ;al保留下来的便是个位BCD码

I/O (Input/Output,输入/输出)

外中断信息
外设的输入到达,相关芯片将向CPU发出相应的中断信息,CPU执行完当前指令后,引发中断过程.

外中断源
1.可屏蔽中断 是CPU可以不响应的外中断,是否响应该终端,取决于标志寄存器IF位的设置.
2.不可屏蔽中断 是CPU必须响应的外中断,中断类型码固定为 2 ,所以不需要取中断类型码,过程如下:
(1)标志寄存器入栈,IF=0,TF=0
(2)CS和IP入栈
(3)(IP)=(2*4),(CS)=(2*4+2)

几乎所有由外设引发的外中断,都是可屏蔽中断.

第9位IF 中断标志,如果IF=1,则CPU在执行完当前指令后响应可屏蔽中断,如果IF=0,则不响应.

sti 用于设置IF=1
cli 用于设置IF=0

键盘输入过程
1.键盘输入
键盘上每个键相当于一个开关,键盘中有一个芯片对每个键的开关状态进行扫描,按下键位芯片就产生一个扫描码,然后送入主板上的相关接口芯片的寄存器,该寄存器的端口地址为60H
松开键位时,也产生一个扫描码,同样也被送入60H端口中

扫描码长度为一个字节  断码 = 通码 + 80H
按下一个键时产生的扫描码 称为 通码 (第7位为0)
松开一个键时产生的扫描码 称为 断码 (第7位为1)

2.引发9号中断
键盘的输入到达60H端口时,相关芯片会发出中断类型码为9的可屏蔽中断信息.CPU检测到后,判断IF标志位,决定是否引发中断过程

3.执行 int 9 中断例程 (BIOS提供了该例程)
(1)读出60H端口中的扫描码

(2)如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;
如果是控制键(如Ctrl)和切换键(如CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元

(3)对键盘系统进行相关的控制,比如向相关芯片发出应答信息(芯片接收到应答后,就认定60H端口的数据已经送出,续而读取下一个键盘输入)

BIOS键盘缓冲区 系统启动后BIOS用于存放int 9中断例程所接收的键盘输入的内存区,可存储15个键盘输入.
int 9中断例程除了接收扫描码,还要产生与扫描码对应的字符,所以一个键盘输入占位2个内存单元,高位字节存放扫描码,低位字节存放字符码(ASCII).如: 1e61h 缓冲区中a的扫描码,存储状态为61 1e

0040:17 单元存储键盘状态字节.记录信息如下:(二进制)
0位: 右shift状态,置1表示按下右shift键
1位: 左shift状态,置1表示按下左shift键
2位: Ctrl状态,置1表示按下Ctrl键
3位: Alt状态,置1表示按下Alt键
4位: ScrollLock状态,置1表示Scroll指示灯亮
5位: NumLock状态,置1表示小键盘输入的是数字
6位: CapsLock状态,置1表示输入大写字母
7位: Insert状态,置1表示处于删除状态

模拟int指令的调用功能,调用的入口地址在ds:0 ds:2中
pushf                  ;标志寄存器入栈
pushf
pop ax
and ah,11111100b
push ax
popf                   ;IF=0 TF=0
call dword ptr ds:[0]  ;CS IP入栈:(IP)=((ds)*16+0),(CS)=((ds)*16+2)

xchg 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)

not 指令 不影响标志寄存器的相关标志位

数据标号(描述了单元长度的标号)
可以使用在其他段中(带有":"的地址标号,只能在当前带代码段中使用)

不但表示内存单元的地址,还表示了内存单元的长度,
即此标号处以后的单元是字节单元,还是字单元,或者是双字单元

注:想在代码段中直接用数据标号,则需用伪指令assume将标号所在的段和一个段寄存器联系起来
ASSUME CS:code DS:data等等,
假如数据标号在data段中,程序中则要给DS赋值段地址(mov ax,data  mov ds,ax)

定义标号:  标号 数据类型 数据内容 ( a db 1,2,3)
标号后面没有":",它同时描述内存地址和单元长度.
标号a,描述了地址(标号所在段的段地址:标号处的偏移地址),和从这个地址开始,以后的内存单元都是字节单元.
用 mov a,ax 将出现错误,操作数类型不匹配
c dd 0 双字单元 操作数类型为word(16位)

例:     d dw 0
指令:   mov ax,b   ;相当于 mov ax,标号所在段的段地址:[标号处的偏移地址]
指令:   mov b,2    ;相当于 mov word ptr 标号所在段的段地址:[标号处的偏移地址],2
指令:   inc b      ;相当于 add word ptr 标号所在段的段地址:[标号处的偏移地址],1
        a db 1,2,3
指令:   mov al,a[si]      ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[si]
指令:   mov al,a[3]       ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[3]
指令:   mov al,a[bx+si+3] ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[bx+si+3]

数据标号0 dw 数据标号1,数据标号2  ;数据标号0处存储着 1 和 2 的偏移地址
相当于 数据标号0 dw offset 数据标号1,offset 数据标号2

数据标号0 dd 数据标号1,数据标号2  ;数据标号0处存储着 1 和 2 的偏移地址和段地址
相当于 数据标号0 dw offset 数据标号1,seg 数据标号1,offset 数据标号2,seg 数据标号2

seg 操作符,取得某一标号的段地址

直接定址表 一种编程技巧,利用表在两个数据集合之间建立一种映射关系,使可以用查表的方法根据给出的数据得到其在另一集合中的对应数据

int 16h 0号子程序
(1)检测键盘缓冲区中是否有数据;
(2)没有则继续做第一步;
(3)读取缓冲区第一个字单元中的键盘输入;
(4)将读取的扫描码送入ah, ASCII码送入al;
(5)将已读取的键盘输入从缓冲区中删除.

基于虚拟阻抗重塑的构网型VSG变流器SISO序阻抗建模与宽频振荡抑制策略分析(面向高比例新能源并网场景) 本文深入探讨了基于虚拟阻抗控制的构网型VSG变流器SISO序阻抗建模技术及其在高比例新能源并网场景中的宽频振荡抑制策略。通过虚拟阻抗重塑,有效改善了变流器的阻抗特性,解决了次/超同步频段的振荡问题,并提供了参数设计、阻抗扫频验证等实用技巧,为新能源并网系统的稳定性提供了可靠解决方案。 阅读详情

相关推荐

深入解析STM32H743双精度FPU:从配置误区到三角函数加速技巧

本文深入解析STM32H743双精度FPU的配置与优化技巧,涵盖常见误区、三角函数加速及飞控系统应用。通过实测数据展示如何利用FPU提升数学运算效率,特别适合工业控制、无人机飞控等高精度实时应用场景。

weixin_29190651的博客 639

汇编总结:mov指令

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33910460的博客 3554

html python mysql交互_干货!Python与MySQL数据库的交互实战

安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。https://www.lfd.uci.edu/~gohlke/pythonlibs/使用Python连接MySQL数据库1)六个常用的连接参数参数...

weixin_31043555的博客 1559

第17 使用BIOS进行键盘输入和磁盘读写

使用int 9和int 16h,键盘的输入与显示。

大草的博客 1044

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1572

卡尔曼滤波算法-Kalman Filter Algorithm

Kalman滤波是一种递归过程,主要有两个更新过程:时间更新和观测更新,其中时间更新主要包括状态预测和协方差预测,主要是对系统的预测,而观测更新主要包括计算卡尔曼增益、状态更新和协方差更新,因此整个递归过程主要包括五个方面的计算:1)状态预测;2)协方差预测;3)卡尔曼增益;4)状态更新;5)协方差更新; 用数学公式表示,如下: 状态预测:(1) 其中,X(k|k)是k时...

sunlin972913894的博客 2万+

8086汇编学习笔记10-端口

8086CPU有两种地址空间,一是内存地址空间,二是端口地址空间,访问端口只能用in和out指令,分别用于从端口读数据和往端口写数据,CPU最多可以定位64KB个不同的端口,端口地址范围为0~65535。 在访问端口时,只能用ax或al来存放从端口读取的数据和往端口写入的数据,8位端口用al,16位端口用ax。 在访问端口号为0~255时在指令中直接给出端口号。 in al, 20h ou...

weixin_30756499的博客 369

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1062

汇编中的端口

1.什么是端口?    我们先了解下CPU和各种外设连接的情况: 各种存储器都和cpu的数据总线,地址总线,控制总线相连。但是除了存储器的芯片外,还有其他的接口芯片:     1.各种接口卡的芯片,如网卡和显卡  2.主板上的接口芯片 3.其他芯片,用来存储相关系统 信息。 在这些芯片中,都有一组寄存器,可以供cpu读写操作。他们在物理上处于不同的外部设备中但是    1.他们都和cpu的...

jiangbinbin的博客 6332

渗透测试实战—云渗透(AK/SK泄露)

渗透测试实战思路分享:getshell方法及横向移动方法,云安全(AK/SK泄露)

网安日记本的博客 4049

从一根USB线缆说起:深入浅出聊聊那些影响信号完整性和EMC性能的‘小细节’(双绞、屏蔽、360度搭接全解析)

本文深入探讨了USB线缆中影响信号完整性和EMC性能的关键细节,包括双绞线绞距、屏蔽层设计和360度搭接工艺。通过实验数据和实用技巧,揭示了这些‘小细节’如何显著影响高频信号质量和电磁兼容性,为工程师提供了从选购到系统设计的全面指南。

weixin_30824479的博客 437

汇编代码杂记

以下面的文件来haha.S来看(从内核源码中搞了点x86汇编代码出来,然后改了改): [root@ovs_test_smb test]# cat haha.S  #define ALIGN           .align 4,0x90 #define ENTRY(name) \   .globl name; \   ALIGN; \   name:

无忧老猪 838

【ESP 保姆级教程】玩转emqx数据集成篇④ ——数据桥接之HTTP服务

主要是学习数据桥接功能以及构建自己的http服务器,这是一个非常有用的功能。包括各种传感器上报基本上都需要数据桥接功能支持,所以还是希望认真学习这一块开发,然后结合数据库存储等等知识点进行进一步学习。

单片机菜鸟哥的博客 1306

arm寄存器与arm汇编杂记

一、arm寄存器arm总共有37个寄存器,31个通用,6个状态寄存器。但不能同时访问,具体的访问情况视cpu工作情况而定!但在任何时候,通用寄存器R14~R0、程序计数器PC(r15)、一个或两个状态寄存器都是可访问的。通用寄存器分类:未分组:R0~R7分组:R8~R14程序计数器PC(R15)二、arm工作状态1、usr态ARM处于用户态模式时,可

4560

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JVM学习杂记

class: public class Test { public void A() { int i = B(); System.out.println(i); } public int B() { int i = 1; int j = 2; int l = (i ...

chiyangmi2011的博客 230

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c++类的定义使用以及小知识杂记

c++

老赵的博客 742

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[汇编 16位]

1.设(DS)=3000H,(ES)=2000H,(SS)=1000H,(BX)=0100H,(BP)=0200H,(S1)=0300H,偏移量DVAL为0400H,试确定下列指令中操作数在内存中的物理地址。 (1)MOV AX,[2000H] (2)MOV AI,50[BX] (3)INC DVAL[SI] (4)MOV DVAL[BP],BL (5)MOV AX,DVAL[BP][S...

枪枪枪的博客 1154

汇编输出当前的系统时间

题目: 在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。这6个信息的长度为1个字节,存放单元为: 秒:0 分:2 时:4 日:7 月:8 年:9 这些数据以BCD码的方式存放。 从CMOS RAM中读取信息的方法是: out 70H,寄存器 ;寄存...

m0_53611007的博客 2626

汇编语言学习笔记——————内存访问

内存访问 内存中字的存储 两个字节 = 一个字 在0地址处开始存放20000(4E20H),如下图所示,高位对应高地址位,低位对应低地址位。 由此需要注意的问题是: 0地址单元存放的字节型数据是20 0地址单元存放的字型数据数是4E20 2地址单元中存放的字节型数据是12 2地址单元中存放的字型数据是0012 1地址单元中存放的字型数据是124E 小结 任何两个地址连续的内存单元,N号单元和...

weixin_42616791的博客 1190

汇编语言||基本传送指令MOV的用法详解

MOV指令 MOV指令,能实现以下操作: CPU内部寄存器之间数据的任意传送(除了码段寄存器CS和指令指针IP以外)。 立即数传送至CPU内部的通用寄存器组(即AX、BX、CX、DX、BP、SP、SI、DI),给这些寄存器赋初值。 CPU内部寄存器(除了CS和IP以外)与存储器(所有寻址方式)之间的数据传送,可以实现一个字节或一个字的传送。 能实现用立即数给存储单元赋初值。 其中...

JockLiu的博客 8万+

汇编学习--7.16--外中断

以前我们讨论的都是CPU对指令的执行。 我们知道,CPU在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出。也就是说,CPU除了有运算能力外,还要有I/O(Input/Output,输入/输出)能力。 比如,我们按下键盘上的确个键,CPU最终要能够处理这个键。在使用文本编辑器时,按下a键后,我们可以看到屏幕上出现“a”,是CPU将从键盘

工作笔记 6373

汇编语言基础知识(三)

1.and指令,可以设置操作对象的相应位为0(与操作)。 2.or指令,可以设置操作对象的相应位位1(或操作)。 3.si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。 4.在编程的时候因为寄存器的数量有限,我们应该把临时变量放到内存中(栈),这和高级语言中的local变量都存储在栈中很类似。 5.在8086CPU中,只有bx,si,di,bp这四个寄存器可以用来进行内存单元的寻址([...])。 6.在[...]中,这四个寄存器可以单个出现或只能以4中

liran2019的博客 1147

汇编语言mov al,0c5h,汇编语言读书笔记 Day 04

问题2.1假定设定AX=0000H, BX=0000H问题程序段中的指令指令执行后AX中的值指令执行后BX中的值mov ax,4E20H4E20H0000Hadd ax,1406H6226H0000Hmov bx,2000H6226H2000Hadd ax,bx8226H2000Hmov bx,ax8226H8226Hadd ax,bx?8226H答案? 应该等于044CH解析8226H + 8...

weixin_32459211的博客 1165

计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解

指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行。一条指令有四个组成部分:标号(可选)指令助记符(必需)操作数(通常是必需的)注释(可选)最近在学习汇编语言,过程中遇到很多问题,对此在以后的随笔会逐渐更新,这次谈谈mov,lea指令的区别一,关于有没有加上[]的问题1,对于mov指令来说:有没有[]对于变量是...

weixin_42522167的博客 5713

汇编指令之MOV

汇编指令之 MOV - 传送字或字节 学习来自 汇编语言MOV指令 mov指令详解 Assembly - Addressing Modes 汇编用户指南-MOV 简单格式:mov dst,src 扩展格式1:MOV{S}{cond} Rd, Operand2 扩展格式2:MOV{cond} Rd, #imm16 1、从寄存器到寄存器(寄存器寻址) MOV EAX, EBX; Both t...

hugh_博客标题 1万+

汇编常用指令

通用寄存器及使用 IA-32系列有8个32位通用寄存器,名称分别为:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI,如图: 简单传送指令 指令 中文名 格式 解释 备注 location MOV 传送指令 MOV DEST,SRC DEST<=SRC P20 XCHG 交换指令 XCHG OPER1,OPER2 把操作数oper1的内容与操作数oper...

ai-exception的博客 6万+
上一篇: 汇编学习杂记(9~13章)
下一篇: GNOME与KDE 发展历史与“性格”
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值