使用汇编语言编程一程序,在屏幕上显示如下图案: ******* ***** *** * 其中第一行“*”的个数由键盘输入数据指定(1~9),若输入的数据是偶数则加1形成奇数。 要求: (1)给出完成的程序代码以及适当的程序注释。
时间: 2023-11-24 17:05:52 浏览: 127
以下是使用汇编语言编写的程序代码,可以在屏幕上显示如下图案:
*******
*****
***
*
其中第一行“*”的个数由键盘输入数据指定(1~9),若输入的数据是偶数则加1形成奇数。
```
.model small
.stack 100h
.data
msg1 db 'Please input a number (1-9): $'
msg2 db 'Invalid input! Please input a number between 1 and 9. $'
star db '*'
space db ' '
cr db 0dh, 0ah, '$'
num dw ?
.code
main proc
mov ax, @data
mov ds, ax
; 输出提示信息
mov ah, 09h
lea dx, msg1
int 21h
; 读取用户输入的数字
mov ah, 01h
int 21h
sub al, 30h ; 将ASCII码转换为数字
cmp al, 0
jl invalid_input ; 输入小于1,跳转到错误处理
cmp al, 9
jg invalid_input ; 输入大于9,跳转到错误处理
test al, 1
jnz odd_num ; 输入为奇数,跳转到odd_num
inc al ; 输入为偶数,加1变成奇数
jmp odd_num
odd_num:
mov num, ax ; 将输入的数字保存到num变量中
; 输出图案
mov cx, num ; 循环次数为输入的数字
mov bx, 0 ; 初始空格数为0
mov ah, 02h ; 设置输出字符的功能号
mov dl, star ; 设置输出字符为星号
mov dh, 0 ; 设置输出字符的颜色为黑底白字
; 输出上半部分
up_loop:
push cx ; 保存循环次数
mov cx, bx ; 输出空格
space_loop:
mov ah, 02h
mov dl, space
int 21h
loop space_loop
mov cx, num ; 输出星号
star_loop:
int 21h
loop star_loop
mov ah, 09h ; 换行
lea dx, cr
int 21h
pop cx ; 恢复循环次数
inc bx ; 空格数加1
dec cx ; 循环次数减1
jnz up_loop ; 循环输出上半部分
; 输出下半部分
mov cx, num ; 循环次数为输入的数字
dec bx ; 初始空格数为上半部分的空格数减1
down_loop:
push cx ; 保存循环次数
mov cx, bx ; 输出空格
space_loop2:
mov ah, 02h
mov dl, space
int 21h
loop space_loop2
mov cx, num ; 输出星号
star_loop2:
int 21h
loop star_loop2
mov ah, 09h ; 换行
lea dx, cr
int 21h
pop cx ; 恢复循环次数
dec bx ; 空格数减1
dec cx ; 循环次数减1
jnz down_loop ; 循环输出下半部分
mov ah, 4ch
int 21h
invalid_input:
; 输出错误信息
mov ah, 09h
lea dx, msg2
int 21h
; 重新读取用户输入
mov ah, 01h
int 21h
jmp main
main endp
end main
```
程序注释:
1. 定义数据段和堆栈大小
```
.model small
.stack 100h
```
2. 定义数据段中的变量
```
.data
msg1 db 'Please input a number (1-9): $'
msg2 db 'Invalid input! Please input a number between 1 and 9. $'
star db '*'
space db ' '
cr db 0dh, 0ah, '$'
num dw ?
```
msg1和msg2分别是输出的提示信息和错误信息,star和space分别是输出的星号和空格,cr是换行符,num是保存用户输入数字的变量。
3. 定义代码段
```
.code
main proc
```
4. 初始化数据段寄存器
```
mov ax, @data
mov ds, ax
```
5. 输出提示信息并读取用户输入的数字
```
; 输出提示信息
mov ah, 09h
lea dx, msg1
int 21h
; 读取用户输入的数字
mov ah, 01h
int 21h
sub al, 30h ; 将ASCII码转换为数字
cmp al, 0
jl invalid_input ; 输入小于1,跳转到错误处理
cmp al, 9
jg invalid_input ; 输入大于9,跳转到错误处理
test al, 1
jnz odd_num ; 输入为奇数,跳转到odd_num
inc al ; 输入为偶数,加1变成奇数
jmp odd_num
```
6. 输出图案
```
odd_num:
mov num, ax ; 将输入的数字保存到num变量中
; 输出上半部分
up_loop:
push cx ; 保存循环次数
mov cx, bx ; 输出空格
space_loop:
mov ah, 02h
mov dl, space
int 21h
loop space_loop
mov cx, num ; 输出星号
star_loop:
int 21h
loop star_loop
mov ah, 09h ; 换行
lea dx, cr
int 21h
pop cx ; 恢复循环次数
inc bx ; 空格数加1
dec cx ; 循环次数减1
jnz up_loop ; 循环输出上半部分
; 输出下半部分
mov cx, num ; 循环次数为输入的数字
dec bx ; 初始空格数为上半部分的空格数减1
down_loop:
push cx ; 保存循环次数
mov cx, bx ; 输出空格
space_loop2:
mov ah, 02h
mov dl, space
int 21h
loop space_loop2
mov cx, num ; 输出星号
star_loop2:
int 21h
loop star_loop2
mov ah, 09h ; 换行
lea dx, cr
int 21h
pop cx ; 恢复循环次数
dec bx ; 空格数减1
dec cx ; 循环次数减1
jnz down_loop ; 循环输出下半部分
```
7. 处理无效输入
```
invalid_input:
; 输出错误信息
mov ah, 09h
lea dx, msg2
int 21h
; 重新读取用户输入
mov ah, 01h
int 21h
jmp main
```
8. 结束程序
```
mov ah, 4ch
int 21h
```
相关问题:
1. 如何在汇编语言中读取用户输入?
2. 如何将ASCII码转换为数字?
3. 如何在汇编语言中输出字符和换行符?
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)