2020.01.19-2020.02.02

1.用github搞了博客

参考:https://www.fast.ai/2020/01/16/fast_template/
并用了他的模板…
页面还没改完

2.汇编语言学习

[BX]和loop指令

一次执行完循环的过程:
g指令:
“g 0012”从当前的cs:ip指向的指令执行,一直到(ip)=0012为止
p指令:
直到(cx)=0为止

段前缀:

在访问内存单元的指令中显式低给出内存单元段地址所在的段寄存器,如:
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss,[bx]
mov ax,ex,[0]

在代码段中使用数据

code segment
“dw 0123,0456”

dw的含义是定义字型数据,因为用dw定义的数据出于代码段的最开始,所以偏移地址为0,这两个数据就在代码段的偏移0,2 处,地址为cs:0,cs:2

将数、代码、栈放入不同的段

一个段的容量不能大于64kb(8086模式的限制)

assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,==stack==
mov ss,ax
mov sp:20h
mov ax,==data== ;将名称为data的段的段地址送入ax(数值)
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start

and 和 or 指令

and:按位进行与运算
mov al,01100011B
and al,001111011B
or:按位进行或运算

or al,00111011B

以字符形式给出的数据

用’…'的方式指明数据是以字符形式给出的,编译器将把它们转化为对应的ascii码
db ‘unix’ 相当于 db 75h,6eh,49h,58h (ascii 码)

[bx+idata]

mov ax,[200+bx]==mov ax,[bx+200]==mov ax,200[bx]==mov ax,[bx].200
(ax)=((ds)*16+(bx)+200)
用[bx+idata]的方式进行数组的处理

SI、DI

是和bx功能相近的寄存器,不能够分成两个8位寄存器来使用
可以使用 [bx+si+idata]和[bx+di+idata]的方式表示内存单元,不能用[si+di]

BP

在8086cpu中只有 si、di、bp、bx四个寄存器能在[…]里进行内存单元的寻址
四个寄存器可以单个出现或只能出现:bx+si;bx+di;bp+si;bp+di。bx+b;si+di是错的
只要使用了bp而没有给出段地址,段地址就默认在ss中

数据位置的表达

1.直接用立即数idata表示:mov ax,1;mov al,‘a’
2.将数据存在寄存器中
3.要处理的数据在内存中,可用[…]的格式给出EA,SA在某个段寄存器中

  • 1.mov ax,[bx+si+8]中 段地址默认在ds中
  • 2.mov ax,[bp+si+8]中 段地址默认在ss中
  • 存放段地址的寄存器也可以显性给出:mov ax,ds:[bx+si+8]
指令要处理的数据的尺寸
  • 1.通过寄存器名指明:ax 字,al/ah 字节
  • 2.用操作符_word/byte__ptr
    inc word ptr [bx]
    add byte ptr [bx],2
    否则cpu无法得知要访问的单元是字单元还是字节单元
  • 3.其他
    如push,[1000]

寄存器整理

bx、si、di、bp:

不使用bp时段地址默认在ds中
使用bp时段地址默认在ss中

dx:累加寄存器
cs:代码
ss:sp:栈顶
ds:数据
cx:loop