内容简介:[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位寄存器则可存放两位十六进制数
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Software Engineering for Internet Applications
Eve Andersson、Philip Greenspun、Andrew Grumet / The MIT Press / 2006-03-06 / USD 35.00
After completing this self-contained course on server-based Internet applications software, students who start with only the knowledge of how to write and debug a computer program will have learned ho......一起来看看 《Software Engineering for Internet Applications》 这本书的介绍吧!