微机原理实验一、编写汇编程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符

本文详细介绍了如何在8086汇编环境下编写程序,从键盘接收小写字母,找出其前导字符和后续字符,并按照顺序显示。涉及变量定义、INT21H中断以及DOS功能的运用。

微机原理实验一、编写汇编程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符

实验目标:
8086 编写汇编程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符
比如输入的是b,则输出的abc

一、 汇编语言中定义变量

在汇编语言中,定义变量的语法规则取决于所使用的汇编器和目标平台。一般情况下,汇编语言中定义变量的语法如下:

变量名   类型    初始值
  • 变量名:变量的名称,必须符合汇编语言的标识符规则,通常使用字母开头,可以包含字母、数字和下划线
  • 类型:变量的数据类型,可以是字节、字(16位)、双字(32位)等。在汇编语言中,常见的数据类型包括 db(字节)、dw(字)、dd(双字)等。
  • 初始值:可选项,表示变量的初始值。? 表示未初始化的变量,即初始值未知。

在汇编语言中,变量的定义通常出现在数据段(DATA SEGMENT)或全局数据段(.data)中。示例代码可能如下所示:

DATA SEGMENT
    input_char      db  ?
DATA ENDS

或者在全局数据段中:

.data
    input_char      db  ?

这样就定义了一个名为 input_char 的字节型变量,初始值未知。在程序中可以通过该变量名来访问和操作这个变量。

1.1 定义行字符序列(俗称回车+换行)

在汇编语言中,newline db 0DH, 0AH, '$' 定义了一个包含换行字符序列的字节型数组。

  • newline 是数组的标签或名称。
  • db 表示定义字节型数据。
  • 0DH 表示回车字符的ASCII码值。
  • 0AH 表示换行字符的ASCII码值。
  • '$' 表示字符串的结束标志,ASCII码值为0。

因此,这行代码定义了一个包含回车和换行字符的字节型数组,用于表示换行字符序列。

1.2 定义栈

在汇编语言中,DW 20 DUP(0) 是定义一个字(16位)型数组,数组长度为20,每个元素初始值为0。

  • DW 表示数据类型,表示字(16位)。
  • 20 表示数组的长度,即数组中元素的个数。
  • DUP(0) 表示复制,将后面括号中的值复制指定次数。这里是将0复制20次,即初始化数组的所有元素为0。

因此,这行代码定义了一个包含20个字节的数组,每个字节的初始值都是0。

1.3 ASSUME CS:CODE, DS:DATA, SS:STACK

在汇编语言中,ASSUME CS:CODE, DS:DATA, SS:STACK 用于告诉汇编器代码段(CS)、数据段(DS)和堆栈段(SS)之间的关系。

  • CS代码段寄存器,指示当前正在执行的指令所在的段。
  • DS数据段寄存器,指示数据存储的段。
  • SS堆栈段寄存器,指示当前堆栈操作的段。

通过 ASSUME 指令,汇编器知道在代码段中,使用标签时要从代码段中查找,而在数据段中,使用标签时要从数据段中查找。同样,堆栈操作也会在堆栈段中进行。

二、 INT 21H

INT 21H这条指令是调用 21H 中断,这是 DOS 提供的一个中断服务。当 AH 寄存器中的值指示了所需的功能时(例如,打印字符串、读取键盘输入等),执行此中断会调用相应的 DOS 功能。

中断功能入口参数出口参数
INT20程序正常退出CS=PSP段地址-
INT21系统功能调用AH=功能号-
INT22程序结束处理--
INT23Ctrl-Break处理AL=0(忽略)-
INT24严重错误处理AL=驱动器号
AL=1(重试)
AL=2(通过INT 23H终止)
Cy=1出错
INT25绝对磁盘读CX=读入扇区数
DX=起始逻辑扇区数
DS:BX=缓冲区地址
AL=驱动器号
Cy=0正确
INT26绝对磁盘写CX=写盘扇区数
DX=起始逻辑扇区数
DS:BX=缓冲区地址
-
INT27驻留退出CS=PSP段地址
DX=程序末地址+1
-

功能号在AH中,并设好其余的入口参数,向DOS发出INT21H命令,最后获得出口参数

调用号(AH)功能入口参数出口参数
00H程序终止CS=PSP段地址-
01H键盘输入字符-AL=输入的字符
02H显示输出DL=显示的字符-
03H串行设备输入-AL=输入的字符
04H串行设备输出DL=输出的字符-
05H打印输出DL=输出的字符-
06H直接控制台I/ODL=0FFH(输入请求)
DL=字符(输出请求)
AL=输入的字符
07H直接控制台I/O (不显示输入)-AL=输入的字符
08H键盘输入字符(无回显)-AL=输入的字符
09H显示字符串DS:DX=缓冲区首址-
0AH输入字符串DS:DX=缓冲区首址-
0BH检查标准输入状态-AL=00无按键
AL=0FFH有按键
0CH清除输入缓冲区并执行指定的标准输入功能AL=功能号(01/06/07/08/0AH)
DS:DX=缓冲区(0AH功能)
AL=输入的数据(功能01/06/07/08)
0DH初始化磁盘状态--
0EH选择缺省的驱动器DL=驱动器号(0=A,1=B…)AL=逻辑驱动器数
0FH打开文件DS:DX=未打开的FCB首址AL=00成功,0FFH失败
10H关闭文件DS:DX=打开的FCB首址AL=00成功,0FFH失败
11H查找第一匹配目录DS:DX=未打开的FCB首址AL=00成功,0FFH失败
12H查找下一匹配目录DS:DX=未打开的FCB首址AL=00成功,0FFH失败
13H删除文件DS:DX=未打开的FCB首址AL=00成功,0FFH失败
14H顺序读DS:DX=打开的FCB首址AL=00成功,01文件结束
02缓冲区太小
03缓冲区不满
15H顺序写DS:DX=打开的FCB首址AL=00成功,01盘满
02缓冲区太小
16H创建文件DS:DX=未打开的FCB首址AL=00成功
0FFH目录区满
17H文件换名DS:DX=被修改的FCB首址AL=00成功,0FFH未找到目录项或文件重名

三、 实现汇编程序

完整的代码:

;#########################################################################
; @Description: 编写汇编程序,从键盘接收一个小写字母,
;				然后找出它的前导字符和后续字符,再按顺序显示这三个字符
;* @Version: 1.0
;* @Autor: Huining Li777
;* @运行:
;       Please input a char: s ----->The characters:rst
;       Please input a char: q ----->The characters:pqr
;* @结束:按下回车结束
;#########################################################################


DATA SEGMENT
    input_char      db  ?           ; 输入字符变量
    output_buffer   db  3 DUP(?)    ; 输出字符缓冲区,用于存储前导字符、输入字符和后续字符
    prompt_input    db  'Please input a char: $' ; 输入提示文字
    prompt_output   db  '----->The characters: $' ; 输出提示文字
    newline         db  0DH, 0AH, '$'  ; 换行字符序列
DATA ENDS

STACK SEGMENT STACK
    DW 20 DUP(0)                    ; 定义一个长度为20的堆栈空间
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK  ; 告诉汇编器代码段、数据段和堆栈段的关系

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

    ; 输出输入提示文字
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    LEA DX, prompt_input            ; 输出输入提示文字
    INT 21H                         ; 输出到控制台

read_loop:
    MOV AH, 01H                     ; DOS功能号,表示"等待键盘输入"
    INT 21H                         ; 调用21h中断
    MOV input_char, AL              ; 将输入的字符存储到 input_char 变量中

    CMP AL, 0DH                     ; 检查是否输入了回车键
    JE exit_program                 ; 如果输入了回车键,退出程序

    ; 计算前导字符
    MOV BL, input_char              ; 将输入字符存储到 BL 寄存器
    DEC BL                          ; 前导字符为输入字符的前一个字符
    MOV output_buffer, BL           ; 将前导字符存储到输出字符缓冲区

    ; 计算后续字符
    MOV BL, input_char              ; 将输入字符存储到 BL 寄存器
    INC BL                          ; 后续字符为输入字符的后一个字符
    MOV output_buffer + 2, BL       ; 将后续字符存储到输出字符缓冲区

    ; 输出输出提示文字
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    LEA DX, prompt_output           ; 输出输出提示文字
    INT 21H                         ; 输出到控制台

    ; 输出前导字符
    MOV AH, 02H                     ; DOS功能号,表示"输出字符"
    MOV DL, output_buffer           ; 要输出的前导字符
    INT 21H                         ; 输出字符到控制台

    ; 输出输入字符
    MOV AH, 02H                     ; DOS功能号,表示"输出字符"
    MOV DL, input_char              ; 要输出的输入字符
    INT 21H                         ; 输出字符到控制台

    ; 输出后续字符
    MOV AH, 02H                     ; DOS功能号,表示"输出字符"
    MOV DL, output_buffer + 2       ; 要输出的后续字符
    INT 21H                         ; 输出字符到控制台

    ; 输出换行
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    LEA DX, newline                 ; 输出换行字符序列
    INT 21H                         ; 输出换行到控制台

    ; 输出输入提示文字
    MOV AH, 09H                     ; DOS功能号,表示"打印字符串"
    LEA DX, prompt_input            ; 输出输入提示文字
    INT 21H                         ; 输出到控制台

    JMP read_loop                   ; 继续循环读取字符

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

CODE ENDS
END START

第三章 8086/8088的寻址方式指令系统 练习题 .单项选择题 1.设BX=2000H,SI=3000H,指令MOV AX,[BX+SI+8]的源操作有效地址为( )。 A.5000H B.5008H C.23008H D.32008H 2.设DS=1000H,ES=2000H,BX=3000H,指令ADD AL,[BX]的源操作数的物理址为(  )。 A.13000H B.23000H C.33000H D. 3000H 3.设DS=2000H,ES=3000H,SI=200H,指令MOV ES:[SI],AL的目的操作数的物理地址为( )。 A.20200H B.30200H C.50200H D.200H 4.指令MOV MEM[BX],AX中的MEM是( )。 A.原码 B.反码 C.补码 D.移码 5.用来作为寄存器间接寻址的寄存器有( )个。 A.8 B.6 C.5 D.4 6.指令MOV [BX+SI],AL中的目的操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 7.指令MOV BX,[BP+5]中的源操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 8.段内间接寻址只改变( )中的内容。 A.CS B.IP C.CSIP D.PSW 9.段间间接寻址只改变( )中的内容。 A.CS B.IP C.CSIP D.PSW 10.下述指令中不改变PSW的指令是( )。 A.MOV AX,BX B.AND AL,0FH C.SHR BX,CL D.ADD AL,BL 11.下述指令中不影响CF的指令是( )。 A.SHL AL,1 B.INC CX C.ADD [BX],AL D.SUB AX,BX 12.两个整数补码9CH7AH相加运算后,会产生( )。 A.无溢出且无进位 B.无溢出但有进位 C.有溢出且有进位 D.有溢出但无进位 13.指令JMP WORD PTR [BX]属于( )寻址。 A.段内直接 B.段内间接 C.段间直接 D.段间间接 14.指令MOV AX,[BX+SI+8]的源操作数属于( )寻址。 A.直接 B.寄存器相对 C.基址变址 D. 相对基址变址 15.指令( )不改变CF的内容。 A.DEC AL B.ADD AX,CX C.SUB [BX],CL D.SBB AL,DL 16.十进制数字74所对应的压缩型BCD码的形式是( )。 A.74 B.74H C.4AH D.4A 17.十进制数字85所对应的非压缩型BCD码的形式是( )。 A.0085 B.0085H C.0805 D.0805H 18.设AL=67H,执行“CMP AL,76H”后,AL=( )。 A.76H B.0DFH C.67H D.00 19.设AL=65H,BL=29H,执行下列指令后,AL=( )。 ADD AL,BL DAA A.8EH B.94 C.94H D.8E 20.压栈操作是( )位数的操作。 A.8 B.16 C.32 D.任意 21.执行IMUL指令时,如果乘积的高位部分不是低位部分的符号扩展,则( )。 A.OF=0、CF=0 B.OF=0、CF=1 C.OF=1、CF=0 D.OF=1、CF=1 22.设AX=3762H,CL=5,执行“SHR AX,CL”后,AX=( )。 A.0376H B.01BBH C.01BB D.0376 23.若要在BUF缓冲区中寻找与AL中不相等的数据,应使用( )SCASB串操作指令。 A.REPNE B.REP C.REPE D.REPNZ 24.如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下条指令的操 作码,那么该条指令的位移量是( )。 A.20H B.1EH C.0DEH D.0E0H 25.如果“JA P”指令的操作码放在0050H, 该指令的位移量为34H,执行完此条指 令转移到取下条指令的偏移地址为( ) A.0082H B.0084H C.0086H D.0088H 26.若DS=1000H,BX=2000H,(12000H)=56H,(12001H)=78H,AX=1000H,执行 “ADD AX,[BX]”指令后,AX=( )。 A.8856H B.6678H C.8800H D.6600H 27.设AX、BX寄存器中存放的是有符号的二进制数据,若执行“CMP AX,BX”指 令后,( )L表示大于则转L。 A.JZ B.JA C.JGE D.JG 28.执行“DIV BX”指令后,( )寄存器中存放商。 A.AL B.AH C.AX D.DX 29.执行“( )AX,BX”指令不改变AX寄存器中的内容。 A.CMP B.ADD C.XOR D.OR 30.若AX=1000H,执行“NEG AX”指令后,AX=( )。 A.1000H B.0E000H C.0F000H D.1001H 二.多项选择题 1.在下列寻址方式中,用来访问内存的寻址方式有( )。 A.寄存器寻址 B.寄存器间接寻址 C.寄存器相对寻址 D.直接寻址 2.用来作为寄存器间接寻址的寄存器有( )。 A.AX B.BX C.BP CX 3.在下列指令中,源操作数使用DS段寄存器进行寄存器相对寻址的有( )。 A.MOV AX,[DI+4] B.MOV AX,ES:[SI+8] C.MOV AX,[BP+4] D.MOV AX,[BX+4] 4.在下列指令中,源操作数的寻址方式是错误的有( )。 A.MOV AX,[DI+BX] B.MOV AX,[SI+DI] C.MOV AX,[BP+BX] D.MOV AX,[DX] 5.在下列指令中,属于段内转移指令的有( )。 A.JMP SHORT A B.JMP [BX] C.JMP DWORD PTR [BX] D.JMP NEAR PTR [BX+SI] 6.在下列指令中,错误的指令有( )。 A.SUB 5,AL B.ADD AL,BX C.INC [BX] D.SHR AX,6 7.执行“CMP AX,8003H”指令后,当AX中的无符号数高于8003H时,下列指令中有效的转移指令有( )。 A.JNB L B.JA L C.JG L D.JNL L 8.可与串操作指令“CMPSW”指令配合使用的重复前缀有( )。 A.REP B.REPZ C.REPNZ D.REPE 9.在下列的输入/输出指令中,正确的指令有( )。 A.IN AX,80H B.OUT DX,AX C.IN AL,340 D.OUT DX,AL 10.在下列的指令中,错误的指令有( )。 A.PUSH AL B.MOV AL,BX C.PUSH 1000H D.CALL AX 11.可以用下列指令代替“LOOP L”指令的有( )。 A.DEC CX B.DEC CX JNZ L JNC L C.DEC CX D.DEC CX CMP CX,0 JE L JE L 三.填空题 1.在条指令中,立即数只能作 操作数。 2.8086/8088 CPU形成的内存物理地址有 位。 3.指令“MOV AX,[BX+SI]”的源操作数在内存的 段。 4.指令“MOV BX,[BP+DI]”的源操作数在内存的 段。 5.指令“MOV AX,ES:[SI]”的源操作数在内存的 段。 6.入栈指令使用的是 段。 7.指令“ADD [BX+SI],AL”的目的操作数是 寻址方式。 8.指令“SUB BX,A[SI]”的源操作数是 寻址方式。 9.指令“JMP DWORD PTR [BX]”属于 寻址方式。 10.可作为寄存器间接寻址的寄存器有 个。 11.堆栈是从 地址向 方向生长的。其操作遵循 的操作原则。 12.在进行弹栈操作时应该先将弹出的数据送 ,然后 。 13.在进行多精度加法运算时,般使用 指令。 14.通用的数据传送指令不影响 。 15.“INC AL” 指令不影响标志位的 位。 16.若AL=11H,执行“NEG AL” 后,AL= 。 17.JMP指令的执行 PSW寄存器中的各位。 18.两个无符号数进行比较时,可以根据 标志位来判断大小。在编写程序时可使用 指令来实现。 19.若执行“DIV BX”,其被除数的高16位必须放在 ,低16位必须放在 。 20.DAA指令只对 寄存器中的内容进行调整。 21.若AL=84H,在执行CBW后,AL= 。 22.十进制数1234的压缩型BCD码为 。 23.执行 AND AL,0FH JNZ L 指令,是检测AL中的 位,当它为非零则转移。 24.若移位指令的移位位数大于1时,其移位位数必须放在 中。 25.如果AL=85H,CL=4,执行“SAR AL,CL”时,AL= ,CF= 。 26.在串操作指令中,SI指向 串,DI指向 串。 27.如果要查找某串中与AL寄存器中有相同的字符(数),则在SCASB指令前应配合使用 重复前缀。 28.转移指令“JNZ L ”的转移范围(十进制)是 。该指令的第二个字节为位移量,用 形式表示。 29.段内调用指令改变 中的内容。 30.段间调用指令改变 中的内容。 四、判断题(判断下列指令是否正确,如果是错误的,请指出错误的原因) 1.ADD AL,BX 2.MOV [BX],SI 3.SUB [BX],[SI] 4.CMP 5,AL 5.MOV CX,AX 6.LEA BL,A 7.SHR AL,6 8.MOV AL,[DI+SI] 9.MOV BL,200H 10.MOV AX,DATA 11.INC [BX] 12.CMP [BX],A ;A为变量 13.MOV AX,‘+’ 14.MOV AX, [BP+BX] 15.ADD AX,[CX] 16.OUT 400,AL 17.JNC P 18.MOV BX,,OFFSET A 19.LEA DI,A[SI] 20.CMP AX,5 五.改错题(按下列指令中的原意改正下列指令) 1.DEC [SI] 2.CMP AL,BX ;8位无符号数比较 3.MOV [DX],AL 4.MOV AL,300H 5.MOV [BX],[DI] ;字节操作 6.ADD AL,[CX+SI] 7.ADD AL,BX ;16位带符号数相加 8.PUSH AL 9.CMP [BX],5 ;字节比较 10.MOV DS,1234H 六.简答题 1.设BX=1000H,SI=2000H,位移量D=3000H,请指出下列各种寻址方式的有效地址是什么? (1)使用D的直接寻址 (2)使用BX寄存器的间接寻址 (3)使用BX寄存器的相对寻址 (4)基址变址寻址 (5)相对基址变址寻址 2.请指出下列各条指令的源操作数的寻址方式是什么? (1)MOV AX,BUF (2)CMP AL,5 (3)ADD [BX+5],AX (4)SUB AX,[BX+SI] (5)ADC AH,A[SI] (6)MOV BX,[SI] (7)AND CX,B[BP+SI] (8)JMP WORD PTR [BX] (9)JMP P (10)JMP FAR PTR P 3.设 DS=2000H, BX=0100H, SI=0002H, (20100H)=12H, (20101H)=34H, (20102H)= 56H, (20103H)= 78H, (21200H)= 2AH, (21201H)= 4CH, (21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器中的内容是多少? (1)MOV AX,1200H (2)MOV AX,BX (3)MOV AX,[1200H] (4)MOV AX,[BX] (5)MOV AX,[BX+1100H] (6)MOV AX,[BX+SI] (7)MOV AX,[BX+SI+1100H] 4.按下列各小题的要求写出相应的汇编语言指令。 (1)把BX寄存器DX寄存器的内容相加,结果存入DX寄存器中 (2)以BXSI寄存器作基址变址寻址方式,把该单元中的一个字传送到AX。 (3)以SI位移量20H作寄存器相对寻址,将该单元中的内容与CX寄存器中的内容相加,结果存入CX寄存器中 (4)清除AX寄存器的内容,同时清除CF标志位 (5)将字单元NUM与0B6H进行比较 5.按下列各小题的要求使用相应的几条指令完成其操作。 (1)将偏移量为200H的存储单元中的数与300H相加,结果存入AX寄存器中 (2)比较AX寄存器中与BX寄存器中的16位有符号数,当AX中的内容大于BX中的内容时转移到L。 (3)将BUF1BUF2中的16位数据交换 (4)测试BUF字缓冲区中第15位,如果为1则转移到P (5)将BUFIBUF2的字相加,结果送S缓冲区 6.设BX=8234H,请说明下列两条指令的区别,执行下列各指令后BX中的内容是什么? SHR BX,1 SAR BX,1 7.分别说明下列每组指令中的两条指令的区别。 (1) MOV BX,BUF LEA BX,BUF (2) OR BL,0FH AND BL,0FH (3) JMP SHORT L JMP L (4) MOV AX,BX MOV AX,[BX] (5) MOV AX,[BX+DI] MOV AX,[BP+DI] 8.说明下列各指令的源操作数目的操作数的存储地方。 (1)MOV [2000H],AX (2)ADD AX,[BX+5] (3)LEA SI,BUF (4)DAA (5)MUL BL 9.指出下列无条件转移指令的转移目标地址是什么?存放在何处? (1)JMP BX (2)JMP WORD PTR [BX] (3)JMP DWORD PTR [BX] (4)JMP P (5)JMP SHORT R 10.说明MOVSBCMPSB各能使用哪些重复前缀? 七.程序分析题 1.现有程序段如下: MOV AX,1234H MOV BX,60H ADD AX,BX 请回答 :(1)该程序段完成的功能是什么? (2)程序段执行完后AX= 。 2.现有程序段如下: MOV AX,0603H MOV BL,8 AAD DIV BL 请回答 :(1)该程序段完成的功能是什么? (2)程序段执行完后AX= 。 3.设AX=0D023H,BX=9FD0H,试分析执行完如下程序段后程序转向何处? ADD AX,BX JNO L1 JNC L2 SUB AX,BX JNC L3 JNO L4 JMP L5 4. 程序段如下: MOV AX,X MOV DX,X+2 ADD AX,Y ADC DX,Y+2 ADD AX,36 ADC DX,0 SUB AX,Z SBB DX,Z+2 MOV W,AX MOV W+2,DX 请回答 :(1)该程序段完成的功能是什么? (2)该程序的操作数是何类型? (3)结果存放在何处? 5.设A为字节变量变量中的内容分别为64H、52H;B为字节变量变量中的内容分别为12H、46H,现有程序段如下: MOV AL,A SUB AL,B DAS MOV C,AL MOV AL,A+1 SBB AL,B+1 DAS MOV C+1,AL 请回答 :(1)该程序段完成的功能是什么? (2)最后结果是什么? 6.现有程序段如下: MOV BL,AL MOV CL,4 SHR BL,CL MOV A,BL AND AL,0FH MOV B,AL 请回答 :(1)该程序段完成的功能是什么? (2)如果AL的初值为56H,则A= ,B= 。 7.现有程序段如下: MOV AL,8 MOV BL,7 MUL BL AAM ADD AX,3030H XCHG AH,AL MOV BUF,AX 请回答 :(1)该程序段完成的功能是什么? (2)BUF两个单元中的值分别为 。 8.现有程序段如下: MOV AX,M MOV DX,N SHR DX,1 RCR AX,1 请回答 :(1)该程序段完成的功能是什么?     (2)若M=1234H,N=5678H,程序运行后DX= ,AX= 。 9.现有程序段如下: XOR AX,AX MOV AX,6342H MOV CX,0404H ROL AH,CL XCHG CH,CL ROR AL,CL 请回答 :(1)该程序段执行后AX= 。 (2)CF= 。 10.现有程序段如下: MOV AX,1 MOV BX,2 MOV CX,4 MOV DX,3 L: INC AX ADD BX,AX SHR DX,1 LOOPNZ L 请回答 :(1)该程序段的循环次数是多少? (2)该程序段执行完后AX= ,BX= ,CX= ,DX= 。 11.现有程序段如下: MOV CX,16 MOV BL,0 MOV DX,1 MOV AX,9AB8H L: TEST AX,DX JZ N INC BL N: SHL DX,1 LOOP L MOV M,BL 请回答 :(1)该程序段完成的功能是什么? (2)该程序段执行完后(M)= 。 12.现有程序段如下: CLD MOV SI,OFFSET BUF1 MOV DI,OFFSET BUF2 MOV CX,100 REP MOVSB 请回答:该程序段完成的功能是什么? 13. 现有程序段如下: CLD LEA DI,BUF MOV AL,20H MOV CX,100 REPNZ SCASB 请回答 :(1)该程序段完成的功能是什么? (2)若ZF=1,表示BUF中 值为20H数据 (3)若BUF的首地址为0,ZF=0,执行完该程序段后DI= 。 14.现有程序段如下: MOV AL,0 MOV BL,1 MOV CX,10 L: ADD AL,BL INC BL LOOP L 请回答 :(1)该程序段完成的功能是什么? (2)该程序执行完后,AL= 。 15.现有程序段如下: MOV AX,M CMP AX,N JA L MOV AX,M+2 CMP AX,N+2 JAZ L MOV BYTE PTR FLG , 0 JMP P L: MOV BYTE PTR FLG , 1 P: … 请回答 :(1)该程序段完成的功能是什么? (2)若M=1234H,N=5678H,则FLG= 。 16.现有程序段如下: MOV CX,100 LEA BX,BUF MOV DX,0 L1:MOV AL,[BX] CMP AL,10 JL L2 INC DX L2:INC BX LOOP L1 请回答 :(1)该程序段完成的功能是什么? (2)如果将JL改为JG,该程序段完成的功能又是什么? 17.设TAB中存放的数据为30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,现有程序段如下: LEA BX,TAB MOV AL,X ;X为数字0~9 XLAT 请回答 :(1)该程序段完成的功能是什么? (2)若X中的内容为4,则AL= 。 18.现有程序段如下: LEA SI,BUF1 LEA DI,BUF2 MOV CX,100 L: MOV AL,[SI+100] MOV [DI],AL INC DI DEC SI LOOP L 请回答:该程序段完成的功能是什么? 19.现有程序段如下: MOV AX,BUF CMP AX,0 JNS L MOV BX,BUF+2 NEG BX MOV BUF+2,BX NOT AX ADC AX,0 MOV BUF,AX L: … 请回答:该程序段完成的功能是什么? 20.现有程序段如下: MOV AL,X AND AL,0FH JZ L MOV BYTE PTR FLG,1 JMP M L: MOV BYTE PTR FLG,0 M: … 请回答:该程序段完成的功能是什么? 八.程序设计题 1.使用串操作指令,将BUF缓冲区中的100个字节清0。 2.比较5个字节的字符串AB,若两个串相等则字节标志单元FLG置0;否则清1。 3.设BUF缓冲区中有100个字数据。编写程序段统计100个字数据中数据为0的个数,并将统计的结果存放在DL寄存器中。 4.计算Z=(X+5)*Y+30,(X,Y为无符号字节数据)。 5.将DX:AX:BX中的48位数乘以2。 6.将有100个字符的缓冲区BUF中的$符号用空格(20H)代替。 7.将有符号的字数据AB中的大者存入C中。 8.测字单元A中的第四位是否为0,是则FLG置1,否则清0。 9.将DX:AX中的32位数据逻辑左移2位。 10.将100个元素的字数组A中的每个元素减1。  
在微机上编写一个汇编语言程序来完成这个任务,需要利用基本的输入输出操作以及计数数组。以下是大概的步骤伪代码: 1. **初始化**: - 设置一个存储字母计数的数组,例如5个元素对应'A'到'U',初始值都为0。 - 开启键盘输入模式。 2. **循环接收字符**: - 使用`IN`指令从键盘读取一个字符并保存到某个寄存器中。 - 检查字符是否是'A', 'E', 'I', 'O', 或 'U': - 使用条件转移指令(如CMP),比较字符与目标字母。 - 如果相等,将对应的计数器加。 3. **控制循环**: - 使用`JMP`或`LOOP`指令检查是否还有剩余字符未处理(例如,如果字符总数小于50,继续循环)。 - 如果达到50个字符的限制,跳出循环。 4. **显示结果**: - 使用输出指令打印每个字母及其对应的计数值。 ```assembly ; 省略了实际的汇编代码,因为这里仅提供伪代码 COUNTS db 0, 0, 0, 0, 0 ; 字母计数数组 CHAR_RECEIVED dw 0 ; 当前已接收字符数 loop_start: in AL, DX ; 从键盘读入字符 cmp AL, 'A' je A_counter cmp AL, 'E' je E_counter ; ... 对其他字母进行同样的比较... A_counter: inc COUNTS[0] jmp continue_loop E_counter: inc COUNTS[1] ... (其余字母的计数部分) continue_loop: inc CHAR_RECEIVED cmp CHAR_RECEIVED, 50 jl loop_start ; 如果未满50个字符,继续 display_counts: ; 打印每个字母及其计数值 ; ... end_program: ret ``` 请注意,这只是一个简化的示例,实际的汇编代码会因使用的汇编语言(如x86 Assembly、MIPS等)而有所不同。此外,汇编语言中通常没有直接的字符串比较打印功能,所以需要结合相应的系统调用或中断服务来完成这些操作。如果你对具体的汇编语法不熟悉,建议查阅相关的汇编教程或参考手册。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

写的什么石山代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值