汇编学习笔记:汇编基础

xeonds

2021.09.08 20:01:38

[[Assembly|汇编笔记系列]]

先放一段源代码。

assume cs:code
code segment

    mov ax, 0ffffh
    mov ds, ax
    mov bx, 0
 
    mov dx, 0
 
    mov cx, 12
 
s:  mov al, [bx]
    mov ah, 0
    add dx, ax
    inc bx
    loop s
 
    mov ax, 4c00h
    int 21h

code ends
end

上面的程序计算ffff:0-ffff:b单元中数据的和,结果存储在dx中。

下面先说些东西再看这个程序。

 存储单元  

存储器被划分为多个存储单元,编号从0开始。一个存储单元可存储一个Byte(B),即8bit(1bit(b)是一个二进制位)或者称作一字节。两个字节合成一个字,也就是字面意思上的字。

 寄存器

这里只讨论8086CPU。CPU主要部件是寄存器。我们通过改写寄存器中的内容来控制CPU,从而完成各种程序。 8086CPU的寄存器有:AXBXCXDXSIDISPBPIPCSSSDSESPSW。后面单独介绍这些寄存器。

 通用寄存器

8086所有寄存器都是16位的,可存放两个字节(或称为一个字)。AXBXCXDX这四个寄存器通常用来存放一般性的数据,所以它们又被称作通用寄存器。它由16个二进制位构成,最右边是最低位,最左边是最高位,编号从零开始,从右往左依次升高,这和数字各位的读写顺序一样。

不仅如此,这四个寄存器每个都能分成2个独立的8位寄存器来使用。AX对应AHAL,H是high,即高八位;L是low,即低八位。另外3个寄存器同理。

字和字节在其中的存储,都是从右至左,从低八位最右侧到高八位最左侧。

内存的读写

首先做一个简单的算数。8位对应256种状态,同时也对应2个16进制数。而8086的物理地址长度是20位,也就对应5位十六进制数。那么,地址应该如何存储呢?用两个寄存器。一个存放16位,另一个存放4位。前者存放的,被称为偏移地址(offset),后者存放的,被称为段地址。

当获得段地址和偏移地址后,CPU中的地址加法器会利用如下公式进行转换:

物理地址=段地址*16+偏移地址

段寄存器

8086中,段地址在段寄存器种存储。它有四个段寄存器:CS,DS,SS,ES。8086要访问内存时由这四个段寄存器提供内存单元的段地址。

[CS:IP]

[jmp]

Debug简介

DS和[address]

mov, add, sub指令

CPU的栈机制

[push,pop]

[bx], loop

段前缀