c语言将十进制数156拆为3个bcd码,并存入30h开始的三个单元
时间: 2024-05-14 18:12:46 浏览: 135
以下是实现代码:
```c
#include <stdio.h>
int main()
{
int num = 156;
int bcd1, bcd2, bcd3;
// 拆分BCD码
bcd1 = num / 100;
bcd2 = (num % 100) / 10;
bcd3 = num % 10;
// 转换为BCD码
bcd1 = (bcd1 / 10) << 4 | (bcd1 % 10);
bcd2 = (bcd2 / 10) << 4 | (bcd2 % 10);
bcd3 = (bcd3 / 10) << 4 | (bcd3 % 10);
// 存储到内存
unsigned char* p = (unsigned char*)0x30;
*p++ = bcd1;
*p++ = bcd2;
*p++ = bcd3;
return 0;
}
```
首先,将要拆分的十进制数156赋值给变量num。
然后,通过整除和取余操作,将num拆分成三个数字bcd1、bcd2和bcd3,分别代表百位、十位和个位的数字。
接下来,将每个数字转换成BCD码。这里采用的方法是:先将数字的十位和个位分别除以10,得到两个单独的数字,然后将它们分别左移4位,再将它们相加,得到BCD码。
最后,将三个BCD码存储到内存地址0x30开始的三个单元中。注意,在存储之前,需要先将指针p指向0x30,然后每存储一个BCD码,p需要递增1。
相关问题
用汇编语言和C51语言实现将十进制数拆为三个BCD码,并存入30会开始的三个单元
汇编语言实现:
MOV A, #123 ;将十进制数123存入累加器A
DIV AB, #100 ;将A除以100,商存入B,余数存入A
MOV R0, A ;将余数存入R0
MOV A, B ;将商存入累加器A
DIV AB, #10 ;将A除以10,商存入B,余数存入A
MOV R1, A ;将余数存入R1
MOV R2, B ;将商存入R2
MOV DPTR, #0030H ;将数据存储地址指向0030H
MOV A, R0 ;将余数存入累加器A
ADD A, #30H ;将余数转换成ASCII码
MOVX @DPTR, A ;将ASCII码存入指针所指向的内存单元
INC DPTR ;指针地址加1
MOV A, R1 ;将余数存入累加器A
ADD A, #30H ;将余数转换成ASCII码
MOVX @DPTR, A ;将ASCII码存入指针所指向的内存单元
INC DPTR ;指针地址加1
MOV A, R2 ;将商存入累加器A
ADD A, #30H ;将商转换成ASCII码
MOVX @DPTR, A ;将ASCII码存入指针所指向的内存单元
C51语言实现:
unsigned int num = 123; //将十进制数123存入变量num
unsigned char bcd1, bcd2, bcd3; //定义三个存储BCD码的变量
bcd1 = num / 100; //将num除以100,商存入bcd1
num = num % 100; //将num对100取余,余数存入num
bcd2 = num / 10; //将num除以10,商存入bcd2
bcd3 = num % 10; //将num对10取余,余数存入bcd3
unsigned char *ptr = 0x0030; //将数据存储地址指向0030H
*ptr++ = bcd1 + 0x30; //将bcd1转换成ASCII码后存入指针所指向的内存单元
*ptr++ = bcd2 + 0x30; //将bcd2转换成ASCII码后存入指针所指向的内存单元
*ptr = bcd3 + 0x30; //将bcd3转换成ASCII码后存入指针所指向的内存单元
DOSbox通过masm和link编写汇编语言程序实现输入一个十进制数得到它对应的二进制数,十六进制数与BCD码,其中该程序包括四个子程序,分别为“readchar读取输入的字符;convert_2 将十进制数转化为二进制数;convert_16 将十进制数转化为十六进制数;convert_BCD 将十进制数转化为BCD码”,其中三个转化结果都需要输出
这是一个很有趣的问题!下面是用MASM和LINK编写的汇编语言程序,实现输入一个十进制数并输出对应的二进制数、十六进制数和BCD码的过程:
```assembly
.model small
.stack 100h
.data
decimal db ?
binary db 9 dup('$')
hexa db 3 dup('$')
bcd db 6 dup('$')
newline db 0Dh, 0Ah, '$'
.code
main proc
mov ax, @data
mov ds, ax
; 读取输入的字符
call readchar
; 将十进制数转化为二进制数
mov al, decimal
call convert_2
mov binary, al
; 将十进制数转化为十六进制数
mov al, decimal
call convert_16
mov hexa, al
; 将十进制数转化为BCD码
mov al, decimal
call convert_BCD
mov bcd, al
; 输出结果
mov ah, 09h
mov dx, offset binary
int 21h
mov dx, offset newline
int 21h
mov dx, offset hexa
int 21h
mov dx, offset newline
int 21h
mov dx, offset bcd
int 21h
mov ah, 4Ch
int 21h
main endp
; 子程序:读取输入的字符
readchar proc
mov ah, 01h
int 21h
sub al, 30h ; 将ASCII码转化为十进制数
mov decimal, al
ret
readchar endp
; 子程序:将十进制数转化为二进制数
convert_2 proc
mov bl, 2 ; 除数为2
xor bh, bh
mov cl, 7 ; 循环7次,处理8位二进制数
mov si, 0 ; 存储结果的偏移地址
convert_2_loop:
mov ah, 0 ; 清空高位字节
div bl ; 除法运算
add ah, 30h ; 结果转化为ASCII码
mov [binary+si], ah ; 存储结果
inc si
loop convert_2_loop
ret
convert_2 endp
; 子程序:将十进制数转化为十六进制数
convert_16 proc
mov bl, 16 ; 除数为16
xor bh, bh
mov cl, 2 ; 循环2次,处理两位十六进制数
mov si, 0 ; 存储结果的偏移地址
convert_16_loop:
mov ah, 0 ; 清空高位字节
div bl ; 除法运算
cmp ah, 9 ; 判断余数是否大于9
jbe convert_16_digit ; 如果余数小于等于9,直接转化为ASCII码
add ah, 07h ; 如果余数大于9,转化为字母的ASCII码
convert_16_digit:
add ah, 30h ; 结果转化为ASCII码
mov [hexa+si], ah ; 存储结果
inc si
loop convert_16_loop
ret
convert_16 endp
; 子程序:将十进制数转化为BCD码
convert_BCD proc
xor ah, ah ; 清空高位字节
xor si, si ; 初始化偏移地址
convert_BCD_loop:
mov al, decimal ; 将十进制数复制到al
aam ; 将al中的十位和个位分别存放在ah和al中
add ah, 30h ; 十位转化为ASCII码
mov [bcd+si], ah ; 存储十位
add al, 30h ; 个位转化为ASCII码
mov [bcd+si+1], al ; 存储个位
add si, 2 ; 偏移地址增加2个字节
cmp ah, 0 ; 判断十位是否为0
jne convert_BCD_loop
ret
convert_BCD endp
end main
```
这个程序使用DOSbox来运行,可以输入一个十进制数,然后输出对应的二进制数、十六进制数和BCD码。希望对你有帮助!
阅读全文