x86汇编基础学习

一维数组的定义

数组本质上就是多个数据的集合,在内存中按照一定顺序排列,角标即为每个数据的偏移值,如果使用db进行数据的定义那么两个数据之间的偏移值为1个字节,如果使用dw指令定义数据,则偏移值为2个字节

data segment
    db 3 dup(1) ;批量定义三个连续的数据 每个数据的偏移量为1  在内存中的排列为 111
data ends
​
data segment
    db 3 dup(1,2,3) ;批量定义三个连续的数据 每个数据的偏移量为1  在内存中的排列为 123123123
data ends

数组的打印

data segment
    array db 128 dup(0)
data ends
​
code segment
    start:
        mov ax,data
        mov ds,ax
        
        mov array[0],1   
        mov array[1],2
        mov array[2],3    
        
​
code ends
end start

外中断

外中断 (硬中断):由外部设备(比如网卡,或者硬盘 键盘 鼠标)引发的中断,比如当网卡收到数据包的时候,就会发出一个中断

中断屏蔽:

cpu监听到外部中断时,第一步需要先判断IF标志位的值,如果为1则执行,如果为0则屏蔽

为什么还有中断屏蔽这么一说? 因为有些重复的外部中断并不需要响应,或者cpu正在在执行非常重要的一段指令,这些指令不能中断,一旦中途调开可能会造成系统崩溃,那么在这种情况下需要先将IF标志位置为0,屏蔽所有可屏蔽的外部信号,等这段指令执行完后,再讲IF还原回1, 这个IF标志位相当于是一个监听外部信号的开关

为了方便IF标志位的修改,8086提供了相应的指令方面我们使用

cli  ;相当于IF=0
​
sti  ;相当于IF=1
键盘中断

当我们按下键盘中的一个键,那么键盘会向cpu发出一个中断信号,cpu接收到信号后判断标志位IF是否为1,如果为1,则执行这个中断

当松开按键时,同样会发出一个中断信号,也就是说点击一个键实际产生了两个中断信号

以上这一系列过程涉及到几个问题:

  1. 键盘是一个外部设备,电信号发出时,cpu怎么知道这个信号是来自键盘而不是鼠标的呢?

  2. cpu又如何知道你按下的是哪一个键?

解答1:

cpu除了可以对寄存器 和内存进行数据读写之外,还可以读写端口的数据,电脑上一共有65535个端口,每个端口相当于是一个数据通道,当外部键盘借助USB接口接入电脑被驱动识别后,势必有一个端口与其相连进行数据通信, 在8086中这个端口号为60H

那么如何使用汇编读写端口中的数据呢?

in al,60H ; 使用in指令 从60h这个端口读取一个字节到al寄存器中去
​
out 60h,al ; 使用out指令 al寄存器中的数据写入60H端口

从端口读写数据必须使用ax或者al寄存器进行交互

解答2:

键盘每个键位所对应的字符都有与之对应的扫描码一一映射,不同厂商键盘硬件对应的扫描码可能不一致,它们最终都会转成相应的ASCII码

键位扫描码参考表可网上查询

如果是控制键ctrl shift 则将其转变成状态字节, 记录到0040:0017这个内存空间中,也就是说当我们按下控制键 这个位置的数据会发生相应的改变

磁盘读写

  1. 概念

    磁盘构造:

    一面 = 80个磁道
    ​
    一个磁道 = 18个扇区
    ​
    一个扇区 = 512byte

  2. 中断

    使用13H号中断

    ;读取磁盘中的数据到0:200H这个内存中
    mov ax,0
    mov es,ax
    mov bx,200h
    ​
    mov al,1 ;读取的扇区数
    mov ch,0 ;磁道号
    mov cl,1 ;扇区号
    mov dl,0 ;驱动器号 软驱a, b
    mov dh,2 ;面号
    mov ah,2 ;2表示读取 3表示写入
    int 13H
    ​
    ​
    ;将0:200H这个内存中数据写入软盘
    mov ax,0
    mov es,ax
    mov bx,200h
    ​
    mov al,1 ;读取的扇区数
    mov ch,0 ;磁道号
    mov cl,1 ;扇区号
    mov dl,0 ;驱动器号 软驱a, b
    mov dh,2 ;面号
    mov ah,3 ;写入
    int 13H

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值