汇编语言-王爽

CPU有三条总线:
地址、数据、控制线
    地址总线确定存储单元
    控制总线发送指令
    数据总线:传输数据
CPU N个地址线 地址总线宽度为N 可以寻找2^N个内存单元
*存储单元
    0开始编号,一个存储单元可以存储一个Byte
8086CPU有16根地址线
    1bit就是一根地址线
注意:存储器以B为最小单位
========================第二章 寄存器==========================
通用寄存器:
    AX BX CX DX 
    AX -> AH和AL
16位寄存器最大能存储的数 2^16 - 1 = 65536 - 1 转十六进制是四位 0~FFFFH
8 位寄存器 2^8 = 256 转十六进制 0~FFH    
8086CPU在内部采用2个16位地址合成的方法来形成一个20位的物理地址
地址加法器:
    物理地址 = 段地址 X 16 + 偏移地址
段地址 X 16 的说法是左移 4 位    一个X进制数左移1位,相当于乘以X

段地址 X 16 + 偏移地址 含义是: CPU 在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

起始、基础地址就是段地址

偏移地址16位,0~FFFFH, 64KB 
*课后题:    
(1)
    CPU寻址范围 (0001H+ 0000H x 16 ) ~ (0001H+FFFFH x 16 ) = 0010H ~ 1000FH
(2)
    SA * 16 + 偏移地址 = 2000H  偏移地址范围 0000H ~ FFFFH

    SA  * 16 = 2000H - 偏移地址

    SA = 2000H / 10H    SA = 10001H / 10H
段寄存器:
    CS:代码段寄存器   IP:指令指针寄存器
    8086中 CS的内容为M,IP的内存为N,CPU从 M*16 + N 开始读取指令执行。
CPU将CS:IP指向的内存单元中的内容看做指令,
-jmp指令:修改CS:IP中的值
jmp 段地址 : 偏移地址
jmp 2AE3:3    CS = 2AE3H IP = 0003H ,CPU将从2AE33H
"jmp 段地址 : 偏移地址" 指令的功能为 修改段地址CS 修改 偏移地址IP

仅修改IP 可以 "jmp 某合法寄存器"
例如:
    jmp ax ,执行前 ax = 1000H CS = 2000H IP = 0003H
             执行后 ax = 1000H CS = 2000H IP = 1000H
jmp ax 就类似于 mov IP,ax
8086CPU工作过程:
1 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
2 IP指向下一条指令
3 重复执行(跳转到1 IP+相应偏移位数)
============================实验==============================
数据存在内存2000:1F60单元中 
数据存在内存的2000H段中的1F60单元中
R    查看改变CPU的值
    R 1000H
D    查看内存中的内容
    d 段地址:偏移地址    例如 d 1000:10
    指定查看范围 d 1000:10 9 (查看9个内存单元)
E    改写内存中的内容
    e 起始地址 数据 数据 数据
    例如 e 1000:0 1 2 3 4 5 6 7 8
U    内存机器指令翻译成汇编指令
T    执行一条机器指令
A    以汇编格式在内存中写入一条机器指令

执行汇编程序步骤
1 T 先让CS:IP指向指令所在的内存单元
2 R 修改CS:IP中的内容

==============第三章寄存器=====================================
*内存中字存储
字节 是一个内存单元, 字 是2个连续的内存单元;
DS寄存器:存放要访问数据的段地址
如何将一个内存单元中的内容送入一个寄存器呢?
mov 寄存器名, 内存单元地址
mov指令如何从10000H中读取数据,
1000:0
1、先将1000H存入ds寄存器
2、mov al [0] 完成传送。0表示内存单元偏移地址是0 段地址默认放在 ds寄存器
*栈
SS:段寄存器  SP:偏移寄存器
        SS:SP指向栈顶元素
    解释 push ax 指令:
    1、SP = SP - 2 SS:SP指向当前栈顶前面的元素,以此为新栈顶
    2、ax 的内容送入SS:SP指向的内存单元处。SS:SP指向新栈顶
人话来说就是:先移动栈顶指针 在把数据送入栈顶指针指向的内存单元处。
    解释 pop ax 指令:
    1、SS:SP指向的内存单元的内容送入ax中
    2、SP = SP + 2 SS:SP指向当前栈下面的元素,以当前栈顶下面的单元为新的栈顶。
    先将栈顶指针的内容送入ax寄存器中,在向下移动栈顶指针。
    pop和push指令格式
    pop 段寄存器     push 段寄存器
    pop 寄存器        push 寄存器  
    pop 内存单元    push 内存单元
    


============第一个汇编程序========================
伪指令
    segment    //段开始
        代码段。。。    
    ends    //段结束
    end        //汇编程序结束标记
    assume :假设某一段寄存器和程序中某一segment...ends定义的段相关联
怎么写一个汇编程序呢?
    1、定义一个段
        demo segment

            mov ax 1000FH

        demo ends

        end
程序返回指令:
    mov ax,4c00H
    int 21H
*[bx] 表示:一个内存单元,它的偏移地址在bx中。
mov ax,[bx]
//将一个内存单元的内容送入到ax,这个内存单元的长度为2字节,存放一个字,偏移地址在bx中,段地址在ds中。
inc bx
// bx中的内容加1   类似于 bx 自增
LOOP指令 循环指令
格式:loop 标号
cpu执行loop指令时会 cs- - ;判断cs中的值,不为0转至标号处执行程序,为0向下执行。
demo segment
    mov ax,2

    mov cx,11
s:    add ax,ax
    loop s

    mov 4c00H
    int 21H
demo ends
end
loop写循环格式
    mov cx 循环次数
    s:
        要循环的代码
        loop s
例题:        
 加法计算 123*236,结果存在ax中
adds segment
    mov ax,0

    mov cx,236

s:    add ax,123
    loop s

    mov 4c00H
    int 21H    
adds ends
end    

dw 定义字节型变量,1个字数据占2个字节单元,读完一个,偏移量 + 1


    


    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值