美文网首页
5.汇编之进制,Loop,段前缀

5.汇编之进制,Loop,段前缀

作者: 听木子说心语 | 来源:发表于2018-05-03 09:17 被阅读0次

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
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

待续中...

相关文章

  • 5.汇编之进制,Loop,段前缀

    1.进制 1.1 聊聊进制我们在学习进制的时候,很多人学不好进制,大概的原因是以十进制为中心去考虑其他进制.我们为...

  • Swift - 二进制,八进制,十六进制的表示方法

    整数各种进制的字面量如下:十进制数,没有前缀二进制数,前缀是0b八进制数,前缀是0o十六进制数,前缀是0x 原文出...

  • 一、(1.2) 整数 浮点数 数字格式 类型转换 布尔类型

    整数 十进制数,没有前缀 二进制数,前缀为0b 八进制数,前缀为0o 十六进制数字,前缀为0x print打印出来...

  • 汇编 - loop

    loop指令 比如计算2^6 练习 计算ffff0~ffff2每个单元中数据的和,结果存放到dx中 常见做法 lo...

  • 整数型字面量

    整数型字面量可以写作: 一个十进制数,没有前缀一个二进制数,前缀是Ob一个八进制数,前缀是O0一个十六进制数,前缀是Ox

  • 6.4-数字表达方式

    一、进制数字表示 二进制:0b或0B为前缀 八进制:以0为前缀 十六进制:以0X或0x为前缀 2、指数表示 用e代...

  • 数字文字

    整数文字可以写成: 一个十进制数,没有前缀 一个二进制数,有0b前缀 一个八进制数,有0o前缀 一个十六进制数,有...

  • Java定义 进制变量

    Java中数值变量的声明:二进制变量的声明以0b为前缀;八进制变量的声明以0为前缀;十六进制变量的声明以0x为前缀...

  • Java-二进制、八进制、十六进制变量声明及与十进制互转

    Java中数值变量的声明:二进制变量的声明以0b为前缀;八进制变量的声明以0为前缀;十六进制变量的声明以0x为前缀...

  • 汇编-----Loop指令

    Loop指令 Loop指令其实就是 循环 的意思 Loop指令需要和CX寄存器配合使用, 用于循环操作, 类似于高...

网友评论

      本文标题:5.汇编之进制,Loop,段前缀

      本文链接:https://www.haomeiwen.com/subject/epdcrftx.html