设计子程序,累加10个元素数组中的元素,并存入相应的内存单元,主程序已给出。 DATA SEGMENT ary DW 1,2,3,4,5,6,7,8,9,10 count DW ($-ary)/2 sum DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX CALL proadd MOV AH,4CH INT 21H ;子程序 CODE ENDS END START
时间: 2023-06-15 09:05:14 浏览: 148
以下是累加数组元素的子程序:
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
proadd PROC
MOV CX,count ;将数组元素个数存储在 CX 寄存器中
MOV SI,0 ;将数组下标初始化为 0
MOV sum,0 ;将 sum 清零
L1: MOV AX,ary[SI] ;将数组元素的值存储在 AX 寄存器中
ADD sum,AX ;将数组元素的值加到 sum 变量中
INC SI ;将数组下标加 1
LOOP L1 ;循环累加数组元素
RET
proadd ENDP
CODE ENDS
主程序中调用子程序的方式如下:
START:
MOV AX,DATA
MOV DS,AX
CALL proadd ;调用子程序
;将累加的结果存储在 sum 变量中
MOV AH,4CH
INT 21H
注意:在子程序中,数组元素的值存储在 AX 寄存器中,并且累加的结果存储在 sum 变量中。累加的过程使用了循环指令 LOOP,每次循环将数组下标加 1,直到循环结束。
相关问题
16、设数据段定义如下: DATA SEGMENT ARY DW -4,32, 56,-13,-87,99,0,32 CNT EQU ($-ARY)/2 MAX DW ? DATA ENDS (1)求ARY中最大值放到MAX单元。(7分) (2)写出查看结果需要使用的debug 命令。(3分) 17、编写完整上机程序,实现如下功能: (1)段内子程序:实现从键盘输入10个字母并将其ASCII码存入到字节数组STRING中。(7分) (2)段间子程序:将STRING中的小写字母都转化成大写字母,并将STRING内容显示输出。(8分)
16、(1)程序如下:
```
DATA SEGMENT
ARY DW -4,32,56,-13,-87,99,0,32
CNT EQU ($-ARY)/2
MAX DW ?
DATA ENDS
CODE SEGMENT
START:
MOV AX, @DATA ;将数据段地址传给AX
MOV DS, AX ;将数据段地址传给DS寄存器
MOV BX, OFFSET ARY ;将ARY数组的偏移地址传给BX
MOV CX, CNT ;将ARY数组的元素个数传给CX
MOV AX, [BX] ;将ARY数组的第一个元素传给AX
MOV MAX, AX ;将MAX初始化为ARY的第一个元素
LOOP_START:
ADD BX, 2 ;将BX寄存器加上2,指向ARY中下一个元素
CMP BX, OFFSET ARY + CNT * 2 ;比较是否越界
JAE END_LOOP ;如果越界,则跳出循环
MOV AX, [BX] ;将当前元素传给AX
CMP AX, MAX ;将AX和MAX比较
JLE LOOP_START ;如果AX小于等于MAX,继续循环
MOV MAX, AX ;否则,将AX的值赋给MAX
JMP LOOP_START ;继续循环
END_LOOP:
MOV BX, OFFSET MAX
MOV AX, [BX] ;将MAX的值传给AX
;在这里可以对AX进行其他操作,例如输出
MOV AH, 4CH ;DOS中断号,指示程序结束运行
INT 21H ;调用DOS中断
CODE ENDS
END START
```
注释:
1. 在数据段中定义了一个DW类型的数组ARY,其中存放了8个整数。
2. CNT是ARY数组中元素个数的计算公式,即($-ARY)/2,其中$表示ARY的当前地址,除以2是因为DW类型占2个字节。
3. MAX是存放最大值的变量。
4. 在代码段中,首先将ARY的第一个元素赋值给AX,然后循环遍历ARY数组的所有元素,将每个元素与MAX比较,如果大于MAX,则将这个元素的值赋给MAX。
5. 最后将MAX的值传给AX,可以在这里对AX进行其他操作,例如输出。
(2)使用Debug命令查看结果:
```
DEBUG
-U MAX ;查看MAX单元的值
```
17、完整上机程序如下:
```
.DATA
STRING DB 10 DUP (?) ;定义10个字节的字节数组
PROMPT DB '请输入10个小写字母:$'
MSG DB '转换为大写字母后的结果为:$'
.CODE
MAIN PROC
MOV AX, @DATA ;将数据段地址传给AX
MOV DS, AX ;将数据段地址传给DS寄存器
;调用从键盘输入10个字母的子程序
CALL READ_STRING
;将字母转换为大写字母
MOV SI, OFFSET STRING ;将STRING的偏移地址传给SI
MOV CX, 10 ;循环10次
MOV BL, 20H ;将BL寄存器的值设为20H,用于将小写字母转换为大写字母
LOOP_CONVERT:
MOV AL, [SI] ;将当前字符传给AL
CMP AL, 'a' ;将AL与小写字母a比较
JB NEXT_CHAR ;如果小于a,则不处理
CMP AL, 'z' ;将AL与小写字母z比较
JA NEXT_CHAR ;如果大于z,则不处理
SUB AL, BL ;将AL中的ASCII码值减去20H,转换为大写字母的ASCII码值
MOV [SI], AL ;将AL的值传回原来的位置
NEXT_CHAR:
INC SI ;将SI寄存器加1
LOOP LOOP_CONVERT ;继续循环
;显示结果
MOV AH, 9 ;DOS显示字符串的功能号
MOV DX, OFFSET MSG ;将MSG的偏移地址传给DX
INT 21H ;调用DOS中断
MOV DX, OFFSET STRING ;将STRING的偏移地址传给DX
INT 21H ;调用DOS中断,显示STRING中的内容
MOV AH, 4CH ;DOS中断号,指示程序结束运行
INT 21H ;调用DOS中断
MAIN ENDP
;从键盘输入10个字母的子程序
READ_STRING PROC
MOV AH, 9 ;DOS显示字符串的功能号
MOV DX, OFFSET PROMPT ;将PROMPT的偏移地址传给DX
INT 21H ;调用DOS中断
MOV DI, OFFSET STRING ;将STRING的偏移地址传给DI
MOV CX, 10 ;循环10次
MOV AH, 1 ;DOS从键盘输入一个字符的功能号
READ_LOOP:
INT 21H ;调用DOS中断
CMP AL, 0DH ;判断是否为回车键
JE READ_DONE ;如果是回车键,就结束输入
MOV [DI], AL ;将输入的字符传给DI所指向的位置
INC DI ;将DI寄存器加1
LOOP READ_LOOP ;继续循环
READ_DONE:
MOV BYTE PTR [DI], 0 ;在字符串末尾添加一个0,表示字符串的结束
RET ;返回主程序
READ_STRING ENDP
END MAIN
```
注释:
1. 在数据段中定义一个10个字节的字节数组STRING和两个字符串PROMPT和MSG。
2. 主程序中,首先调用READ_STRING子程序,从键盘输入10个字母,并将其存储在STRING中。
3. 然后调用LOOP_CONVERT子程序,将STRING中的小写字母转换为大写字母。
4. 最后,将转换后的结果显示在屏幕上。
子程序READ_STRING用于从键盘输入10个字母,并将其存储在STRING中。
1. 写出完整程序,把一个字符串中的所有小写字母改为相应的大写字母,该字符串以‘$’结尾。该字符串定义如下: DATA SEGMENT STR DB ‘HELLO,everybody!$’ DATA ENDS2. 已知有一个首地址为BUF的数组,编写完整程序,计算数组中所有数值的和,并存放在TOTAL单元中,数据段定义如下: DATA SEGMENT BUF DW 56,47, 92,123,-45, 6, 87, -25, 31,19TOTAL DW ? DATA ENDS
1. 以下是一个将字符串中所有小写字母转换为大写字母的程序:
```
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
STR DB 'HELLO,everybody!$'
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
LEA SI, STR ; SI指向字符串的第一个字符
UPPERCASE:
MOV AL, [SI] ; 将当前字符存储在AL寄存器中
CMP AL, 'a' ; 如果当前字符是小写字母
JB NEXT ; 则跳转到下一个字符
CMP AL, 'z' ; 如果当前字符是小写字母
JA NEXT ; 则跳转到下一个字符
SUB AL, 32 ; 转换为大写字母
MOV [SI], AL ; 将转换后的字符存储回字符串中
NEXT:
INC SI ; 指向下一个字符
CMP BYTE PTR [SI], '$' ; 如果到达字符串末尾
JE EXIT ; 则跳转到程序结束
JMP UPPERCASE ; 继续处理下一个字符
EXIT:
MOV AH, 4CH ; DOS退出调用
INT 21H
CODE ENDS
END START
```
2. 以下是一个计算数组中所有值的和的程序:
```
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
BUF DW 56, 47, 92, 123, -45, 6, 87, -25, 31, 19
TOTAL DW ?
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
MOV CX, 10 ; 数组中有10个值
MOV BX, 0 ; 初始值为0
LEA SI, BUF ; SI指向数组的第一个元素
SUM:
ADD BX, [SI] ; 将当前元素的值添加到总和中
ADD SI, 2 ; 指向下一个元素
LOOP SUM ; 继续处理下一个元素
MOV AX, BX ; 将总和存储在AX寄存器中
MOV [TOTAL], AX ; 将总和存储在TOTAL单元中
MOV AH, 4CH ; DOS退出调用
INT 21H
CODE ENDS
END START
```
阅读全文