找回密码
 register

QQ登录

只需一步,快速开始

查看: 42|回复: 1

[汇编语言] [零基础入门学习]·07·寄存器·字在寄存器中的存储·初识汇编指令·检测点2.1

[复制链接]

[汇编语言] [零基础入门学习]·07·寄存器·字在寄存器中的存储·初识汇编指令·检测点2.1

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2024-12-22 15:39 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

2.2 字在寄存器中的存储

出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据。

  • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
  • 字:记为word,一个字由两个字节组成,这两个字节分别称为这字的高位字节和低位字节,如图2.5所示。
    001.webp

一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。如图2.4所示,一个字型数据20000,存在AX寄存器中,在AH中存储了它的高8位,在AL中存储了它的低8位。AH和AL中的数据,既可以看成一个字型数据的高8位和低8位,这个字型数据的大小是20000;又可以看出是两个独立的字节型数据,它们的大小分别为78和32。

关于数制的讨论

任何数据,到了计算机中都是以二进制的形式存放的。为了描述不同的问题,又经常将它们用其他的进制来表示。比如图2.4中寄存器AX中的数据是0100111000100000,这就是AX中的信息本身,可以用不同的逻辑意义来看待它。可以将它看作一个数值,大小是20000。
当然,二进制数0100111000100000本身也可表示一个数值的大小,但人类习惯的是十进制,用十进制20000表示可以使我们直观地感受到这个数值的大小。

十六进制的一位相当于二进制数四位,如 0100111000100000 可表示成:4(0100)、E(1110)、2(0010)、0(0000)四位十六进制数。

一个内存单元可存放8位数据,CPU中的寄存器又可存放n个8位的数据。也就是说,计算机中的数据大多是由1~N个8位数据构成。很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL中是20。这种表示方法便于许多问题的直观分析。在以后的课程中,我们多用十六进制来表示一个数据。

在以后的课程中,为了区分不同的进制,在十六进制表示的数据后面加H,在二进制表示的数据后面加B,十进制表示的数据后面什么也不加。如:可用3个不同的进制表示图2.4中的AX的数据,十进制:20000,十六进制:4E20H,二进制:0100111000100000B。

2.3 几条汇编指令

通过汇编指令控制CPU进行工作,看一下表2.1中的几条指令。

汇编指令 控制PCU完成的操作 用高级语言的语法描述
mov ax,18 将18送入寄存器AX AX=18
mov ah,78 将78送入寄存器AH AH=78
add ax,8 将寄存器AX中的数值加上8 AX=AX+8
mov ax,bx 将寄存器BX中的数据送入寄存器AX AX=BX
add ax,bx 将AX和BX中的数值相加,结果存在AX中 AX=AX+BX

注意:为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的函数。在写一条汇编指令或者一个寄存器的名称时不区分大小写。如:mov ax,18 和 MOV AX,18 的含义相同;bx和BX的含义相同。

接下来看一下CPU执行表2.2中所列的程序段中的每条指令后,对寄存器中的数据进行的改变。

表 2.2 程序段中指令的执行情况之一(原AX中的值:0000H,原BX中的值:0000H)

程序段中的指令 指令执行后AX中的数据 指令执行后BX中的数据
mov ax,4E20H 4E20H 0000H
add ax,1406H 6226H 0000H
mov bx,2000H 6226H 2000H
add ax,bx 8226H 2000H
mov bx,ax 8226H 8226H
add ax,bx ?(参见问题2.1) 8226H

问题 2.1

指令执行后AX中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令add ax,bx,在执行前ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH。

表2.3中所列的一段程序的执行情况。

表2.3 程序段中指令的执行情况之二(原AX中的值:0000H,原BX中的值:0000H)

程序段中的指令 指令执行后AX中的数据 指令执行后BX中的数据
mov ax,001AH 001AH 0000H
mov bx,0026H 001AH 0026H
add al,bl 0040H 0026H
add ah,bl 2640H 0026H
add bh,al 2640H 4026H
mov ah,0 0040H 4026H
add al,85H 005CH 4026H
add al,93H ?(参见问题2.2) 4026H

问题2.2

指令执行后AX中的数据为多少?思考后分析。
分析:
程序段中的最后一条指令add al,93H,在执行前,al中的数据为C5H,相加后所得的值为:158H,但al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。(这里的丢失,指的是进位值不能在8位寄存器中保存,但是CPU并不真的丢失这个进位值,关于这个问题,我们将在后面的课程中讨论。)

注意,此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为ah和al是两个不相关的寄存器,不要错误地认为,注入add al,93H的指令产生的进位会储存在ah中,add al,93H进行的是8位运算。

如果执行add ax,93H,低八位的进位会存储在ah中,CPU在执行这条指令时认为只有一个16位寄存器ax,进行的是16位运算。指令add ax,93H执行后,ax中的值为:0158H。此时,使用的寄存器是16位寄存器ax,add ax,93H相当于将ax中的16位数据00C5H和另外一个16位数据0093H相加,结果是16位的0158H。

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add ax,20000

等都是正确的指令,而:

mov ax,bl             (在8位寄存器和16位寄存器之间传送数据)
mov bh,ax             (在16位寄存器和8位寄存器之间传送数据)
mov al,20000          (8位寄存器最大可存放值为255的数据)
add al,100H           (将一个高于8位的数据加到一个8位寄存器中)

等都是错误的指令,错误的原因都是指令的两个操作对象的位置不一致。

检测点2.1

(1)写出每条汇编指令执行后相关寄存器中的值。

mov ax,62627    AX=_________
mov ah,31H      AX=_________
mov al,23H      AX=_________
add ax,ax       AX=_________
mov bx,826CH    BX=_________
mov cx,ax       CX=_________
mov ax,bx       AX=_________
add ax,bx       AX=_________
mov al,bh       AX=_________
mov ah,bl       AX=_________
add ah,ah       AX=_________
add al,6        AX=_________
add al,al       AX=_________
mov ax,cx       AX=_________

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。

没有通过检测点请不要向下学习!
做完后再看二楼的参考答案

  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
楼主
Waylee 楼主

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2024-12-22 23:08 | 显示全部楼层 | Google Chrome | Windows 10

参考答案与解析

(1)写出每条汇编指令执行后相关寄存器中的值

mov ax,62627    AX=F4A3 ;注意这里是十进制的62627,转换成十六进制为F4A3
mov ah,31H      AX=31A3 ;这里是将31H送入AX寄存器的高八位,所以低八位的值不会改变
mov al,23H      AX=3123 ;将23H送入AX寄存器的低八位,所以高八位值不变
add ax,ax       AX=6246 ;将AX寄存器里的值加到AX里,相当于 AX = AX+AX
mov bx,826CH    BX=826C ;将826C送入BX寄存器中
mov cx,ax       CX=6246 ;将AX寄存器的值送入CX寄存器中,上一次AX里的值为6246,所以将6246送入CX
mov ax,bx       AX=826C ;上一次BX寄存器中的内容为826C,所以将826C送入AX里
add ax,bx       AX=04D8 ;将BX中的值和AX中的值相加放入AX中,注意这里相加后的值为104D8H,超出了AX寄存器的范围,所以只会保留低16位的值
mov al,bh       AX=0482 ;将BX高八位寄存器的值放入AX低八位寄存器中
mov ah,bl       AX=6C82 ;将BX低八位寄存器的值放入AX高八位寄存器中
add ah,ah       AX=D882 ;将AX高八位寄存器的值和AX高八位寄存器的值相加放入AX高八位寄存器中
add al,6        AX=D888 ;AX低八位寄存器的值加6
add al,al       AX=D810 ;将AX低八位寄存器的值和AX低八位寄存器的值相加放入AX低八位寄存器中,注意这里相加后的值为110,由于是八位寄存器,所以只会保留低8位的值即10
mov ax,cx       AX=6246 ;将CX寄存器的值放入AX中,上一次CX中的值为6246,所以将6246放入AX中

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

mov ax,2  ;将2放入AX寄存器中,此时AX寄存器中的值为2
add ax,ax ;将AX寄存器中的值和AX寄存器中的值相加放入AX寄存器中,此时AX寄存器中的值为 2+2 = 4
add ax,ax ;将AX寄存器中的值和AX寄存器中的值相加放入AX寄存器中,此时AX寄存器中的值为 4+4 = 8
add ax,ax ;将AX寄存器中的值和AX寄存器中的值相加放入AX寄存器中,此时AX寄存器中的值为 8+8 = 16
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-15 17:25 , Processed in 0.110957 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表