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分)
时间: 2024-02-25 08:55:18 浏览: 68
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中。
阅读全文