微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

功能: 将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL
; 调试结果:
input:AX <-- 1234H
output: AL <-- 1H BL <–2H CL <–3H DL <–4H

一、 SHR 逻辑右移指令

SHR 是 x86 汇编中的逻辑右移指令,用于将一个寄存器或内存位置的二进制数向右移动指定的位数,并将移出的位保存到进位标志位(CF)中

语法为:

SHR destination, count
  • destination:要进行右移的操作数,可以是寄存器或内存位置。
  • count:要右移的位数,可以是立即数或者存放着位数的寄存器。

执行 SHR AH, CL 指令后,AH 寄存器中的内容向右移动 CL 寄存器中的值,移出的位被保存到进位标志位(CF)中。

1.1 误区:MOV BL, CF

注意!!有一个坑
虽然前面有说过将移出的位保存到进位标志位(CF)中但是…

CF(Carry Flag,进位标志位)是一个单独的标志位寄存器,用于标记算术操作中的进位。SHR 指令将 AH 寄存器中的内容右移指定的位数,并将被移出的位(即最右边的位)存储在 CF 中。但是,MOV 指令无法直接将 CF 寄存器中的值移动到另一个寄存器中。

因此,无法通过MOV BL, CF来实现将 CF 中的值直接移动到 BL 寄存器中。要使用 CF 中的值,您需要先将其与其他寄存器或数据进行操作,然后将结果存储到 BL 寄存器中。

例如,您可以通过以下方式使用 CF 寄存器中的值:

; 假设您已经执行了 SHR AH, CL 指令,CF 中存储了移出的位

; 判断 CF 是否为 1(表示有进位)
CMP CF, 1
JE has_carry ; 如果 CF 为 1,则跳转到有进位的处理过程

; CF 为 0,没有进位的处理过程
...

has_carry:
; CF 为 1,有进位的处理过程
...

或者,您可以将 CF 寄存器中的值与其他数据进行逻辑或算术运算,然后将结果存储到 BL 寄存器中。

二、 实现将16位数分为四组的逻辑

    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH
  1. MOV AX, num:将双字寄存器 num 中的值加载到 AX 寄存器中,以备后续的操作。

  2. MOV CL,4:将要进行的位移数(4)加载到 CL 寄存器中,因为我们想要将双字寄存器的值分为高低两部分,每部分各占 4 位。

  3. MOV BX,AXMOV DX,AX:这两行将 AX 寄存器的值分别复制到 BX 寄存器和 DX 寄存器中,以便稍后的操作。这是为了保存 AX 寄存器的值,因为我们要对它进行修改。

  4. SHR AH,CL:将 AH 寄存器中的值向右移动 CL 次,即将 AX 中的高 4 位移到 AH 中。这样就完成了高低位的分组。

  5. MOV AL,AH:将 AH 寄存器中的值移动到 AL 寄存器中,这样 AL 中就存储了原始值的高 4 位。

  6. AND BH,0FH:将 BH 寄存器中的值与 0FH(00001111B)进行按位与操作,这样就只保留了低 4 位的值,将其他位清零。

  7. MOV BL,BH:将 BH 寄存器中的值移动到 BL 寄存器中,这样 BL 中就存储了原始值的低 4 位。

  8. MOV DH,DL:将 DL 寄存器中的值移动到 DH 寄存器中,这是为了备份 DL 寄存器中的值,因为接下来要对 DL 进行操作。

  9. AND DL,0FH:将 DL 寄存器中的值与 0FH 进行按位与操作,这样就只保留了 AL 中的低 4 位的值,将其他位清零。

  10. SHR DH,CL:将 DH 寄存器中的值向右移动 CL 次,即将 AL 中的高 4 位移到 DH 中。这样就完成了对原始值的高 4 位的处理。

  11. MOV CL,DH:将 DH 寄存器中的值移动到 CL 寄存器中,这样 CL 中就存储了原始值的高 4 位。

三、实现程序完整代码(结果未打印)

下面程序的结果没有打印出来,但是可以通过调试的手段看到各寄存器的值

DATAS SEGMENT
    ; 此处输入数据段代码
    num DW 0H           ; 用于存放待分组的数

DATAS ENDS

STACKS SEGMENT
    ; 此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS        ; 将数据段的段地址加载到 AX 寄存器中
    MOV DS,AX           ; 将 AX 寄存器中的数据段地址设置到 DS 寄存器,以便程序能够访问数据段中的数据
    
    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH

    MOV AH,4CH          ; DOS 功能号,表示"程序终止"
    INT 21H             ; 终止程序的执行

CODES ENDS

END START

四、使用串口打印出各寄存器的值

实现效果:
在这里插入图片描述

;#########################################################################
; @Description: 将AX寄存器中的16位数分成4组,
;               每组4位,让后把这四组数分别放在AL,BL,CL,DL
;* @Version: 1.0
;* @Autor: Huining Li777
;* @input:  num DW 4444H 
;* @output:
;       AL: 4
;       BL: 4
;       CL: 4
;       DL: 4
;#########################################################################

DATAS SEGMENT
    ; 此处输入数据段代码
    num DW 4444H           ; 用于存放待分组的数
    outputAL    DB 'AL: $' ; 输入提示文字
    outputBL    DB 'BL: $' ; 输入提示文字
    outputCL    DB 'CL: $' ; 输入提示文字
    outputDL    DB 'DL: $' ; 输入提示文字
    newline     DB 13, 10, '$' ; 换行符
DATAS ENDS

STACKS SEGMENT
    ; 此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS        ; 将数据段的段地址加载到 AX 寄存器中
    MOV DS,AX           ; 将 AX 寄存器中的数据段地址设置到 DS 寄存器,以便程序能够访问数据段中的数据

    MOV AX, num         ; 将 num 的值加载到 AX 寄存器中,待分组的数
    MOV CL,4            ; 将要右移的位数加载到 CL 寄存器中,右移 4 位,即分组为高 4 位和低 4 位
    MOV BX,AX           ; 将 AX 寄存器的值复制到 BX 寄存器中
    MOV DX,AX           ; 将 AX 寄存器的值复制到 DX 寄存器中,ax 值先保存至寄存器中

    ; AL 存放 AH 中的高 4 位,右移
    SHR AH,CL
    MOV AL,AH

    ; BL 存放 AH 中的低 4 位,与操作
    AND BH,0FH
    MOV BL,BH

    MOV DH,DL           ; 准备给 CL
    ; DL 存放 AL 中低 4 位,与操作
    AND DL,0FH
    ; CL 存放 AL 中高 4 位,右移
    SHR DH,CL
    MOV CL,DH

    MOV BH,DL           ; 保存 DL 中低 4 位,用于输出

    ; 输出 AL、BL、CL、DH 的值
    ;MOV AH, 09H         ; DOS 功能号,表示"输出字符串"

    MOV DX, OFFSET outputAL  ; 设置DX为输出字符串的地址
    MOV AH, 09H              ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出字符串到控制台

    MOV DL, AL          ; 将 AL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H            ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputBL  ; 设置DX为输出字符串的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出字符串到控制台

    MOV DL, BL          ; 将 BL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputCL  ; 设置DX为输出字符串的地址
    INT 21H             ; 输出字符串到控制台

    MOV DL, CL          ; 将 CL 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV DX, OFFSET newline ; 设置DX为换行符的地址
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    INT 21H             ; 输出换行符到控制台

    MOV DX, OFFSET outputDL  ; 设置DX为输出字符串的地址
    INT 21H             ; 输出字符串到控制台

    MOV DL, BH          ; 将 BH 寄存器的值传递给 DL 以便输出
    ADD DL, '0'         ; 将数字转换为对应的 ASCII 码
    MOV AH, 02H         ; 设置 DOS 功能号为 "输出字符"
    INT 21H             ; 输出字符到控制台

    MOV AH,4CH          ; DOS 功能号,表示"程序终止"
    INT 21H             ; 终止程序的执行

CODES ENDS

END START
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器16位数分成4每组4,然后把这四组分别放在ALBLCLDL。 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOT MATCH’。 5.5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次。 5.6 编写程序,将一个包含有20个据的M分成两个:正P和负N,并分别把这两个据的个显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字的最小偶,并把它放在AX。 5.8 把AX存放的16二进制K看作是8个二进制的“四分之一字节”。试编写一个程序,要求一下值为3(即11B)的四分之一字节,并将该在终端上显示出来。 5.9 试编写一汇编语言程序,要求从键盘接收一个四的十六进制,并在终端上显示与它等值的二进制。 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文的出现次,并以格式”SUNXXXX“显示出次。 5.11 从键盘输入一系列以$为结束的字符串,然后对其的非字字符进行计,并显示出计结果。 5.12 有一个首地址为MEM的100D字,试编制程序删除所有为零的项,并将后续项向前压缩,最后将的剩余部分补上零。 5.13 在STRING到STRING+99单元存放着一个字符串,试编制一程序测试该字符串是否存在字,如有,则把CL的第五置1,否则置0. 5.14 在首地址为TABLE的按递增次序存放着100H个16补码,试编写一个程序把出现次最多的及其出现的次分别放在AX和CX。 5.15 据段已定义了一个有N个字据的M,试编写一程序求出M绝对值最大的,把它放在据段的M+2n单元,并将该的偏移地址存放在M+2(n+1)单元。 5.16 在首地址为DATA的字,存放了100H个16补码,试编写一个程序求出它们的平均值放在AX寄存器;并求出有多少个小于此平均值,将结果放在BX寄存器。 5.17 试编写一个程序,把AX的十六进制转换为ASCII码,并将对应的ASCII码依次存放到MEM的四个字节,例如:当(AX)=2A49H时,程序执行完后,MEM的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D之间的30个存入以GRADE为首地址的30个字,GRADE+i表示学号i+1的学生的成绩。另一个RANK为30个学生的名次表,其RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE的学生成绩,将学生名次填入RANK。 5.19 已知A包含15个互不相等的整,试编写一程序,把既在A又在B出现的整存在于C。 5.20 设在A,B和C单元存放着三个,若三个都不是0,则求出三树之和并存放于D单元;其有一个为0,则把其他两个也清零。试编写此程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写的什么石山代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值