前言

最近在看着《汇编语言》这本书,记录了书内前篇的小结以及问答题的练习

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 中的数据为多少?
首先在上一条指令执行后的 AXBX 数据都为 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

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

  1. mov ax,bx
  2. mov bx,cx
  3. mov ax,18H
  4. mov al,18H
  5. add ax,bx
  6. add ax,20000

等都是正确的指令,而:

  1. mov ax,bl (在8位寄存器和16位寄存器之间进行数据传送)
  2. mov bh,ax (在16位寄存器和8位寄存器之间进行数据传送)
  3. mov al,20000 8位寄存器最大可存放255数据)
  4. add al,100H (将一个高于8位的数据添加到一个8位寄存器中)

等都是错误的,因为两个操作对象的位数是不一致的;

问题2.3

问题:请写出左侧指令运行后 右侧的结果为多少?

  1. mov ax,62627 AX = f4a3H
  2. mov ah,31H AX = 31a3H
  3. mov al,23H AX = 3123H
  4. add ax,ax AX = 6246H
  5. mov bx,826cH BX = 826cH
  6. mov cx,ax CX =6246H
  7. mov ax,bx AX = 826cH
  8. add ax,bx AX = 04d8H
  9. mov al,bh AX = 0482H
  10. mov ah,bl AX = 6c82H
  11. add ah,ah AX = d882H
  12. add al,6 AX = d888H
  13. add al,al AX = d810H
  14. mov ax,cx AX = 6246H

问题2.4


分析:

已得知:CS=2000HIP=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 = 1000HIP = 0000 经过在地址加法器计算,又到了 10000H 执行
上图执行流程为:

  1. mov ax,6622H
  2. jmp 1000:3
  3. mov ax,0000
  4. mov bx,ax
  5. jmp bx
  6. mov ax,0123H
  7. 之后如此循环

关于位数之间的关系(自己所理解的)

  • 一位16进制相当于4位二进制,两位16进制相当于8位二进制也就是为一个独立使用的寄存器,如:alah,等,一个8位寄存器则可存放两位十六进制数