8086 cpu
寄存器的说明-------------------------------------------------------------
ax bx dx si di
ax 是十六位寄存器 系统位
ax = al + ah
al 代表 ax 的低位
ah 代表 ax 的高位
bx 是八位寄存器
[bx] 代表着 ds:[bx][dx] 代表着 es:[dx]
cx sp bp ip
cx(关联循环次数和判断)
sp(关联栈的指针指向)
bp()
ip(关联代码段的偏移地址)
ds es ss cs (段寄存器) .. 数据段 扩展段 栈段 代码段
注意:
通用寄存器间 [bx+dx] [si+di] 这两种组合的错误的!!!
汇编里数据的定义--------------------------------------
*.asmdb (byte) 字单元
bw (word) 字
dd (double word) 双字
db 0,0,0,0/db 4 dup(0) 00 00 00 00
db '0123' 30 31 32 33
db 0,1,2,3 00 01 02 03
bw 0,0,0,0/dw 4 dup(0) 00 00 00 00 00 00 00 00
bw 0,1,2,3 00 00 01 00 02 00 03 00
bw '0','1','2','3' 00 00 31 00 32 00 33 00
dd 0,0/dd 2 dup(0) 00 00 00 00 00 00 00 00
dd 0,1 00 00 00 00 01 00 00 00
dd '0','1' 30 00 00 00 31 00 00 00
dd '0123','4567' 33 32 31 30 37 36 35 34
word ptr / dword ptr / short ptr / near ptr
offoset 标号
伪指令 | 伪指令用法 |
---|---|
db | 字节(Byte)8位 用法: db <数据> |
dw | 字(Word)16位 用法: dw <数据> |
双字(DoubleWord)32位
用法:
dd <数据>
0,0,0,0 4个,几 位的数 也可以这样写:4 dup(0)
'0','0','0','0' 4个,几 位的字符 (ASCII) 也可以这样写:4 dup(’0‘)
汇编指令的使用------------------------------------
mov ax,bx ;ax=bx
add ax,1 ;ax=ax+1
inc ax ;ax++
xor ax,1 ;ax=ax-1
dec ax ;ax--
push ax ;入栈 cpu: sp=sp-2 ss:[sp]=ax
pop ax ;出栈 cpu: ax=ss:[sp] sp=sp+2
(循环标号)
...
执行是 cpu: cx=cx-1 cx==0
jmp ;无条件跳转
用法:jmp ax,jmp cs:bx ,jmp short 标号 jmp near ptr 标号
jcxz;有条件跳转 当 cx==0 跳转 cx!=0 不跳转
nop 无指令 代表一字节空间
指令 | 用法 | 说明 |
---|---|---|
mov | mov ax,bx | 赋值指令 mov ax,bx ;将 bx 值 赋于 ax |
push | push ax | 入栈指令 push ax ;将 ax 值压人栈中 cpu 内部工作 sp=sp-2,ss:[sp]=ax |
pop | pop ax | 出栈指令 pop ax ;将 栈指针指向的值取出赋于ax cpu 内部工作 ax=ss:[sp],sp=sp+2 |
jmp | jmp short jmp btye ptr [*] jmp near ptr jmp word ptr [*] jmp far ptr jmp dword ptr [*] |
无条件跳转指令 short 段内短转移 near 段内近转移 far 段间远转移 |
jcxz | jcxz 标号 | 有条件跳转指令 短转移 cpu 内部工作 cx==0 等跳 不等不跳 跟 loop 相反 |
loop | 标号 ... loop 标号 | 循环指令 短转移 cpu 内部工作 cx=cx-1 判断 cx==0 不等跳 等不跳 |
nop | 无指令代表1(byte) 的空代码空间 |
指令 | 用法 | 说明 |
---|---|---|
add | add ax,1 | 不带进位加法指令 |
adc | add dx,1 | 带进位加法指令 |
inc | inc ax | 自身加1指令 代表高级语言里 i++ |
sub | sub ax,1 | 不带借位减法指令 |
sbb | sbb dx,1 | 带借位减法指令 |
dec | dec ax | 自减1指令 代表高级语言里 i-- |
指令 | 用法 | 说明 |
---|---|---|
内存空间的区段讲解--------------------------------------------------------
8086 内存空间分配的段表示B8000H~BFFFFH 32kb空间 dos系统的显存 80*25色彩字符模式的显示器缓冲区
显示器缓冲区分8页, 每页 4kb (≈4000b) +000 ~ +F9F 4000(byte) F9F
1.B8000~B8F9F
2.B8FA0~B9F3F
3.B9F40~BAEDF
4.BAEE0~BBE7F
5.BBE80~BCE1F
6.BCE20~BCEBF
7.BDDC0~BED5F
8.BED60~BFCFF
BFD00 ~ BFFFF ... +0~+2FF ???
在80*25色彩模式下 显示器可显示25行 每行80字符
偏移 000~09F 为第 1 行 (80字符(word)为160字节(byte))
偏移 0A0~13F 为第 2 行
依次类推 偏移到 F00 ~ F9F 为 25 行
每个字符 有两字节 低字节存储字符 ASCII 码 高字节存储字符属性
每个字符可以有256种属性(背景色,前景色,闪烁,高亮等组合)
0000 0000 = hex:00
7 654 3 210 (8位) 8色
<0>:闪烁 <0 0 0>背景色 0:高亮 <0 0 0>:前景色
<0> <R G B> 0 <R G B>
R:红
G:绿
B:蓝