1.进制
-
1.1 聊聊进制
我们在学习进制的时候,很多人学不好进制,
大概的原因是以十进制为中心去考虑其他进制.
我们为什么一定要转换十进制呢?
因为我们队十进制最熟悉,所以才转换.
每一种进制都是完美的,
想学好进制首先要忘掉十进制,
也要忘掉进制间的转换. -
1.2 进制的定义
进制.png
-
1.3 二进制简写
二进制简写.png
-
1.4 常见的数据宽度
数据宽度.png
-
1.5 计算机中的有符号数和无符号数

计算机数据存储它会分为有符号数和无符号数
上图中,
有符号数:
正数: 0 1 2 3 4 5 6 7
负数: F E D B C A 9 8
-1 -2 -3 -4 -5 -6 -7 -8
- 1.6 进制的运算
8进制加法表
1+1 = 2
1+2 = 3 2+2 = 4
1+3 = 4 2+3 = 5 3+3 = 6
1+4 = 5 2+4 = 6 3+4 = 7 4+4 = 10
1+5 = 6 2+5 = 7 3+5 = 10 4+5 = 11 5+5 = 12
1+6 = 7 2+6 = 10 3+6 = 11 4+6 = 12 5+6 = 13 6+6 = 14
1+7 = 10 2+7 = 11 3+7 = 12 4+7 = 13 5+7 = 14 6+7 = 15 7+7 = 16
加法表有没有和我们小时候被的乘法表很相似,有没有勾起你儿时的回忆~~
8进制乘法表
1*1 = 1
1*2 = 2 2*2 = 4
1*3 = 3 2*3 = 6 3*3 = 11
1*4 = 4 2*4 = 10 3*4 = 14 4*4 = 20
1*5 = 5 2*5 = 12 3*5 = 17 4*5 = 24 5*5 = 31
1*6 = 6 2*6 = 14 3*6 = 22 4*6 = 30 5*6 = 36 6*6 = 44
1*7 = 7 2*7 = 16 3*7 = 25 4*7 = 34 5*7 = 43 6*7 = 52 7*7 = 61
案例(8进制计算)
2 + 4 = ? 6
2 * 4 = ? 10
4 + 6 = ? 12
4 * 6 = ? 30
222 + 333 = ? 555
234 * 54 = ? 15320

234 - 54 = ? 160
234 / 4 = ? 47
2. Loop
- 2.1 loop指令和cx配合使用,用于循环执行重复的操作,类似于高级语言中的for,while循环.
- 2.2 使用格式
mov cx,循环次数
标号:
循环执行的程序段
loop 标号
-
2.3 loop指令的执行过程
Loop指令的执行过程.png
- 2.4 小时牛刀
案例一:
编程计算2^2,结果存在ax中.
分析:设(ax)=2,可计算(ax)=(ax)*2,最后(ax)中的为2^2的值.
程序:
assume cs:code
code segment
mov ax,2
add ax,ax
;退出程序
mov ah,4c00h
int 21h
code ends
end
案例二:
编程计算2^3
分析:2 ^3 = 2 * 2 * 2,若设(ax)=(ax) * 2 * 2,最后(ax)中的2^3的值.
assume cs:code
code segment
mov ax,2
add ax,ax
add ax,ax
;退出程序
mov ah,4c00h
int 21h
code ends
end
案例三:
编程计算2 ^ 6
分析:2^6 = 2 * 2 * 2 * 2 * 2 * 2,若设(ax)=(ax) * 2 * 2 * 2 * 2 * 2
assume cs:code
code segment
mov ax,2
add ax,ax
add ax,ax
add ax,ax
add ax,ax
add ax,ax
code ends
end
案例四:
如果我们循环上千次,我们要写999次循环,
那样的话,写起来会麻烦,
我们简化一下上面的代码吧
assume cs:code
code segment
mov ax,2
mov cx,5
s:
add ax,ax
loop s
code ends
end
我们分析一下案例四,
-
标号
标号代表一个地址,这个地址有一条指令:add ax,ax -
loop s
CPU执行loop s的时候,需要两步操作:
1.(cx)=(cx)-1
2.判断cx的值,不为0则转至标号s所标识的地址处执行,如果为0则执行下一条指令. -
内部循环
1.执行 mov cx,5,设置(cx)=5
2.执行 add ax,ax(第一次)
3.执行 loop s 将(cx)减1 ,(cx)=4,(cx)不为0,所以转至s处
4.执行add ax,ax(第二次)
5.执行loop s 将(cx)减1,(cx)=3,(cx)不为0,所以转至s处
6.执行add ax,ax(第三次)
7.执行loop s 将(cx)减1,(cx)=2,(cx)不为0,所以转至s处
8.执行add ax,ax(第四次)
9.执行loop s 将(cx)减1,(cx)=1,(cx)不为0,所以转至s处
10.执行add ax,ax(第五次)
11.执行loop s将(cx)减1,(cx)=0,(cx)为0,所以向下执行 -
cx 和loop指令相配合实现循环功能
cx和loop指令.png
3.段前缀
-
3.1 mov ax,[bx] ,bx的值是便宜地址,段地址默认在ds中.
-
mov ax,ds:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中. -
mov ax,cs:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在cs中. -
mov ax,ss:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ss中. -
mov ax,es:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在es中. -
mov ax,ss:[0]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ss中. -
mov ax,cs:[0]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在cs中. -
指明内存单元的段地址的ds,cs,ss,es,成为段前缀.
3.2 段前缀的使用
- 将内存ffff:0ffff:b单元中的数据复制到0:2000:20b单元中

assume cs:code
code segment
mov bx,0 ;(bx)=0,偏移地址从0开始
mov cx,12 ;(cx)=12,循环12次
s:
mov ax,0ffffh
mov ds,ax ;(ds)=offffh
mov dl,[bx] ; (dl)=((ds)* 16 +(bx)),将ffff:bx中的数据传入dl
mov ax,0020h
mov ds,ax ;(ds)=0020h
mov [bx],dl ;((ds)*16+(bx))=(dl),将dl的数据送入0020:bx
inc bx ;(bx)=(bx)+1
loop s
mov ax,4c00h ;退出程序
int 21h
code ends
end
-
改进程序
改进程序分析
assume cs:code
code segment
mov ax,offffh
mov ds,ax ;(ds)=offffh
mov ax,0020h
mov es,ax ;(es)=0020h
mov bx,0 ;(bx)=0,此时ds:bx指向ffff:0,es:bx指向0020:0
mov cx,12 ; (cx)=12,循环12次
s:
mov dl,[bx] ;(dl)=((ds)*16 +(bx)),将ffff:bx中的数据送入dl
mov es:[bx],dl ;((es)* 16 +(bx))=(dl),将dl中的数据送入0020:bx
inc bx ;(bx)=(bx)+1
loop s
mov ax,4c00h ;退出程序
int 21h
code ends
end
待续中...
网友评论