,输入一个十进制整数,将其转化为二进制数输出,要求定义并调用函数dtob(n),函数的功能是输出n的二进制结果。
时间: 2023-04-03 17:03:07 浏览: 145
好的,我可以回答这个问题。请看以下代码:
```c
#include <stdio.h>
void dtob(int n) {
if (n > 1) {
dtob(n / 2);
}
printf("%d", n % 2);
}
int main() {
int n;
printf("请输入一个十进制整数:");
scanf("%d", &n);
printf("转化为二进制数为:");
dtob(n);
printf("\n");
return 0;
}
```
这个程序中,我们定义了一个函数`dtob`,它的功能是将一个十进制整数转化为二进制数并输出。我们在`main`函数中读入一个十进制整数,然后调用`dtob`函数输出它的二进制结果。
相关问题
汇编语言的宏指令及子程序设计从键盘输入10个无符号十进制数,将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并在屏幕上显示出来,要求在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现,将键盘输入的十进制转换为二进制由子程序DTOB实现,在N个无符号字节型二进制数中找出最大数由子程序FMAX实现,将一个无符号字节型二进制数转换为十进制数并显示在屏幕上由子程序BTOAD实现
以下是汇编语言程序的代码实现:
```
; 定义宏指令DSTRING
DSTRING MACRO str
mov ah, 09h ; 调用DOS中断21h的09h功能,显示字符串
lea dx, str ; 将字符串地址存入DX寄存器
int 21h ; 执行中断
ENDM
; 定义子程序DTOB
DTOB PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov bx, 02h ; 将除数设为2
mov cx, 08h ; 将循环次数设为8
mov ax, [si] ; 将十进制数读入AX寄存器
mov dx, 0000h ; 将DX寄存器清零
convert:
div bx ; 将AX寄存器中的值除以2
push dx ; 将余数存入栈中
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convert ; 如果循环未结束则继续执行
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov cx, 08h ; 将循环次数设为8
load:
pop dx ; 从栈中取出一个二进制位
or dl, 30h ; 将其转换为ASCII码
mov [si], dl ; 将ASCII码存入NUM数组中
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne load ; 如果循环未结束则继续执行
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
DTOB ENDP
; 定义子程序FMAX
FMAX PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov al, [si] ; 将第一个数读入AL寄存器
mov bl, al ; 将AL寄存器的值赋给BL寄存器
inc si ; 数组指针加1
dec cx ; 循环次数减1
loop:
cmp al, [si] ; 比较AL寄存器的值与当前数值的大小
jae skip ; 如果AL大于或等于当前数值,则跳过
mov bl, [si] ; 如果AL小于当前数值,则将BL寄存器的值更新为当前数值
skip:
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne loop ; 如果循环未结束则继续执行
mov si, offset RESULT ; 将RESULT的地址存入SI寄存器
call BTOAD ; 调用BTOAD子程序将二进制数转换为十进制数
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
FMAX ENDP
; 定义子程序BTOAD
BTOAD PROC NEAR
push ax ; 保存寄存器状态
push bx
push cx
push dx
mov cx, 08h ; 将循环次数设为8
mov al, 01h ; 将AL寄存器的值初始化为1
xor bx, bx ; 将BX寄存器清零
mov si, offset NUM ; 将NUM的地址存入SI寄存器
convert:
mov dl, [si] ; 将二进制位读入DL寄存器
sub dl, 30h ; 将ASCII码转换为数字
mul al ; 将AL乘以2
add bx, ax ; 将BX加上AL乘以DL的结果
mov ax, bx ; 将结果存入AX寄存器
shr al, 1 ; 将结果除以2,得到下一位数值
mov bx, ax ; 将结果存入BX寄存器
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convert ; 如果循环未结束则继续执行
mov ah, 02h ; 调用DOS中断21h的02h功能,显示字符
mov cx, 04h ; 将循环次数设为4
display:
mov al, bl ; 将BL寄存器的值存入AL寄存器
shr al, cl ; 将AL寄存器右移cl位,得到当前位的数值
and al, 01h ; 将AL寄存器与00000001进行按位与运算,得到当前位的值
add al, 30h ; 将当前位的值转换为ASCII码
mov dl, al ; 将DL寄存器存入AL寄存器
int 21h ; 调用DOS中断21h的02h功能,显示字符
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne display ; 如果循环未结束则继续执行
DSTRING maxNumStr ; 显示字符串提示信息
mov dl, bl ; 将最大数值存入DL寄存器
add dl, 30h ; 将最大数值转换为ASCII码
mov ah, 02h ; 调用DOS中断21h的02h功能,显示字符
int 21h ; 执行中断
pop dx ; 恢复寄存器状态
pop cx
pop bx
pop ax
ret ; 返回子程序
BTOAD ENDP
; 主程序开始
NUM db 10 dup (?) ; 定义存放二进制数的数组
RESULT db 8 dup (?) ; 定义存放最大数值的数组
maxNumStr db 'The maximum number is: ', '$' ; 定义字符串提示信息
start:
DSTRING prompt ; 显示字符串提示信息
mov cx, 10 ; 将循环次数设为10
mov si, offset NUM ; 将NUM的地址存入SI寄存器
input:
mov ah, 01h ; 调用DOS中断21h的01h功能,等待键盘输入
int 21h ; 执行中断
cmp al, 0Dh ; 判断是否输入回车键
je exit ; 如果输入回车键则跳转到程序结束部分
sub al, 30h ; 将ASCII码转换为数字
mov [si], al ; 将数字写入NUM数组中
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne input ; 如果循环未结束则继续执行
mov si, offset NUM ; 将NUM的地址存入SI寄存器
mov cx, 10 ; 将循环次数设为10
convertAll:
call DTOB ; 调用DTOB子程序将十进制数转换为二进制数
inc si ; 数组指针加1
dec cx ; 循环次数减1
cmp cx, 00h ; 判断循环是否结束
jne convertAll ; 如果循环未结束则继续执行
call FMAX ; 调用FMAX子程序找出最大数值
exit:
mov ah, 4Ch ; 调用DOS中断21h的4Ch功能,结束程序
int 21h ; 执行中断
```
用汇编语言编写程序:从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在屏幕上显示出来。 要求: ① 在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现; ② 将键盘输入的十进制数转换成二进制数由子程序DTOB实现; ③ 在N个无符号字节型二进制数中找出最大数的功能由子程序FMAX实现; ④ 将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的功能由子程序BTOAD实现。
这是一道比较典型的汇编语言编程题目,下面是代码实现:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
NUM DB 10 DUP(0) ; 存放二进制数
MAX DB 0 ; 存放最大值
STR1 DB "请输入10个小于256的十进制数,以空格分隔:$"
STR2 DB "转换为二进制数后为:$"
STR3 DB "最大值为:$"
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
DSTRING STR1 ; 显示输入提示信息
; 读取键盘输入的10个十进制数,并进行转换
MOV CX, 10
MOV SI, 0
READ_INPUT:
MOV AH, 01H ; 读取键盘输入
INT 21H
CMP AL, ' ' ; 判断是否输入结束
JE INPUT_FINISH
SUB AL, '0' ; 将字符转换为数字
MOV BL, AL
CALL DTOB ; 转换为二进制数
MOV NUM[SI], BL
INC SI
JMP READ_INPUT
INPUT_FINISH:
DSTRING STR2 ; 显示转换后的二进制数
; 找出最大值
CALL FMAX
MOV MAX, AL
DSTRING STR3 ; 显示最大值
CALL BTOAD
MOV AH, 4CH
INT 21H
MAIN ENDP
; 子程序: 将一个十进制数转换成二进制数
; 输入: BL - 十进制数
; 输出: BL - 二进制数
DTOB PROC
MOV CL, 8
XOR BH, BH ; 清空高位
CONVERT:
SHR BL, 1 ; 右移一位,相当于除以2
RCL BH, 1 ; 将余数加到高位
LOOP CONVERT
MOV BL, BH
RET
DTOB ENDP
; 子程序: 在N个二进制数中找出最大值
; 输入: NUM - 存放二进制数的数组
; CX - 数组长度
; 输出: AL - 最大值
FMAX PROC
MOV AL, NUM[0]
MOV BX, CX
DEC BX ; 设置循环次数
FIND_MAX:
CMP AL, NUM[BX]
JGE NOT_MAX
MOV AL, NUM[BX]
NOT_MAX:
DEC BX
LOOP FIND_MAX
RET
FMAX ENDP
; 子程序: 将一个二进制数转换为十进制数并在屏幕上显示
; 输入: BL - 二进制数
; 输出: 无
BTOAD PROC
MOV CL, 8
MOV AH, 2 ; 显示字符
CONVERT:
SHL BL, 1 ; 左移一位,相当于乘以2
JC ADD_ONE ; 判断是否需要加1
MOV DL, '0'
JMP DISPLAY
ADD_ONE:
MOV DL, '1'
DISPLAY:
INT 21H ; 显示当前位的字符
LOOP CONVERT
RET
BTOAD ENDP
END MAIN
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)