内容简介:[TOC]最近在看着《汇编语言》这本书,记录了书内前篇的小结以及问答题的练习PS:好久没有更新博客了,出来冒个泡。
[TOC]
前言
最近在看着《汇编语言》这本书,记录了书内前篇的小结以及问答题的练习
PS:好久没有更新博客了,出来冒个泡。
(这是我年初看的,然后做的笔记,距离年初我看这本书已经过去了8个月了,嗯,然后,现在已经忘记的差不多了:joy::joy::joy:)
小结
-
汇编指令是机器指令的助记符,同机器指令一一对应;
-
每一种CPU都有自己的汇编指令集;
-
CPU可以直接使用的信息在存储器中存放;
-
在存储器中指令和数据没有任何区别,都是二进制信息;
-
存储单元从零开始顺序编号;
-
一个存储单元可以存8个bit,也就是8位二进制数;
-
8bit = 1Byte、1024B = 1KB、1024KB = 1MB、1024MB = 1GB、1GB = 2014TB
-
8086有14个寄存器,每个寄存器都有一个名称,这些寄存器为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
-
8086CPU的寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX,这4个寄存器通常用来存放一般的数据,被称为通用寄存器。
-
AX、BX、CX、DX可以分为两个独立使用的8位寄存器来用
- AX 可分为:AH、AL;
- BX 可分为:BH、BL;
- CX 可分为:CH、CL;
- DX 可分为:DH、DL;
-
AX寄存器的低8位由0~7组成的AL寄存器,高8位由8-15组成的AH寄存器。AL和AH是可以独立使用的8位寄存器。
书中作者为了区分进制在数字后加H作为该值为十六进制,因此H代表着十六进制数
问题2.1
指令执行后 AX 中的数据为多少? 首先在上一条指令执行后的 AX 与 BX 数据都为 8226H 那么 add ax,bx 就是为: ax = 0x8226 + 0x8226 = 0x1044c ; 由于 AX 寄存器为16位寄存器,所以最高位 1 是没办法存储在 AX 中,最后结果为: 044c ,因为 04为8位、4c为8位 一共16位
问题2.2
指令执行后 AX 中的数据为多少? 首先在上一条指令执行完后 AX 寄存器中的值为: 00C5 ; 当 add al,93H 指令执行执行后运算过程为: 0xc5+0x93=0x158 ; 由于 al 是8位寄存器,只能存储两位16进制数,所以高位的 1 则无法保存至 al 寄存器中,最后 AX 结果为: 0058 ;
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
mov ax,bx mov bx,cx mov ax,18H mov al,18H add ax,bx add ax,20000
等都是正确的指令,而:
mov ax,bl (在8位寄存器和16位寄存器之间进行数据传送) mov bh,ax (在16位寄存器和8位寄存器之间进行数据传送) mov al,20000 (8位寄存器最大可存放255数据) add al,100H (将一个高于8位的数据添加到一个8位寄存器中)
等都是错误的,因为两个操作对象的位数是不一致的;
问题2.3
问题:请写出左侧指令运行后 右侧的结果为多少?
mov ax,62627 AX = f4a3H mov ah,31H AX = 31a3H mov al,23H AX = 3123H add ax,ax AX = 6246H mov bx,826cH BX = 826cH mov cx,ax CX =6246H mov ax,bx AX = 826cH add ax,bx AX = 04d8H mov al,bh AX = 0482H mov ah,bl AX = 6c82H add ah,ah AX = d882H add al,6 AX = d888H add al,al AX = d810H mov ax,cx AX = 6246H
###问题2.4 分析:
已得知: CS=2000H , IP=0000H 首先将: 0x2000 * 16 + 0x0000 = 0x20000 放进地址加法器中计算,然后拿出了 B8 22 66 长度为: 3Byte 因此 IP 加 3 变成了 0003 , 执行 mov ax,6622H 命令后: AX=6622H 然后 0x2000 * 16 + 0x0003 = 0x20003 拿出了 EA 03 00 00 10 长度为: 5Byte 因此 IP 加5 变成了 0008 指令执行完后 CS = 1000H ip = 0003 然后 0x1000 * 16 + 0x0003 = 0x10003 拿出了 B8 00 00 长度为 3Byte 因此 IP 加 3 变成了 0006 然后执行指令后 AX = 0000 接着 0x1000 * 16 + 0x0006 = 0x10006 拿出了 8B D8 长度为: 2Byte 因此 IP 加2 变成了 0008 然后执行指令后 BX = 0000 0x1000 * 16 + 0x0008 = 0x10008 拿出 FF E3 长度为: 2Byte 因此 IP 加2 变成了 000A 然后执行指令后 IP变成了: 0000 (因为 jmp 具有修改 IP 值 的功能) 此时: CS = 1000H , IP = 0000 经过在地址加法器计算,又到了 10000H 执行 上图执行流程为:
mov ax,6622H jmp 1000:3 mov ax,0000 mov bx,ax jmp bx mov ax,0123H 之后如此循环
关于位数之间的关系(自己所理解的)
- 一位16进制相当于4位二进制,两位16进制相当于8位二进制也就是为一个独立使用的寄存器,如:
al、ah,等,一个8位寄存器则可存放两位十六进制数
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Redis开发与运维
付磊、张益军 / 机械工业出版社 / 2017-3-1 / 89.00
本书全面讲解Redis基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后的原因, 包含大规模集群开发与管理的场景、应用案例与开发技巧,为高效开发运维提供了大量实际经验和建议。本书不要求读者有任何Redis使用经验,对入门与进阶DevOps的开发者提供有价值的帮助。主要内容包括:Redis的安装配置、API、各种高效功能、客户端、持久化......一起来看看 《Redis开发与运维》 这本书的介绍吧!