阅《汇编语言》记录的小结笔记及练习题(一)
前言
最近在看着《汇编语言》这本书,记录了书内前篇的小结以及问答题的练习
PS:好久没有更新博客了,出来冒个泡。
(这是我年初看的,然后做的笔记,距离年初我看这本书已经过去了8个月了,嗯,然后,现在已经忘记的差不多了
)
小结
- 汇编指令是机器指令的助记符,同机器指令一一对应;
- 每一种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位寄存器则可存放两位十六进制数
版权声明:阅《汇编语言》记录的小结笔记及练习题(一),本文出处:Poacher's Blog
本文链接:http://bugsafe.cn/archives/246.html
如非特别注明,本站内容均为博主原创,转载请务必注明作者和原始出处。