; 本程序通过编译,运行正确
Data Segment
org 200h
Data_BCD db 58h ;两位BCD码
db ?,? ;保存转换后的ASCII码
Data Ends
Code Segment
Assume CS:Code,DS:Data
Start: mov ax,Data
mov ds,ax ;数据段段地址
mov al,Data_BCD ;取两位BCD码
xor ah,ah ;累加器高位字节清零
mov cx,4 ;逻辑左移、右移次数
shl ax,cl ;ax左移4位,把两位BCD码的高4位移到累加器高字节
shr al,cl ;把两位BCD码的低4位移回原位置,实现两位BCD码的拆分
or ax,3030h ;高低位分别加上30h,实现两位BCD码到ASCII码的转换
mov Data_BCD[1],ah ;保存高位ASCII码
mov Data_BCD[2],al ;保存低位ASCII码
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
我只能给你写主程序,其它的自己加吧。
第一题:先定义一个内存缓冲区,然后用dos功能调用
从键盘输入字符串到缓冲区。然后将缓冲区数据分类,
DL存小写字母个数,DH存数字个数,BH存其它字符个数。
BUFF
DB
100
;定义100字节缓冲区
DB
?
;系统填入实际输入字节数
DB
100
DUP(?)
MOV
AX,
DATA
MOV
DS,
AX
MOV
DX,
OFFSET
BUFF
MOV
AH,
0AH
;10号功能调用,从键盘
;输入字符,回车键结束。
INT
21H
MOV
BX,
DX
MOV
CL,
[BX+1]
LEA
SI,
OFFSET
BUFF
ADD
SI,
2
XOR
BX,
BX
XOR
DX,
DX
BEGIN:MOV
AX,
[SI]
CMP
AX,
'z'
JA
THREE
CMP
AX,
'a'
JL
TWO
INC
DL
JMP
NEXT
TWO:
CMP
AX,
'9'
JA
THREE
CMP
AX,
'0'
JL
THREE
INC
DH
JMP
NEXT
THREE:INC
BH
NEXT:
INC
SI
LOOP
BEGIN
MOV
AH,
2
INT
21H
MOV
DL,
20H
INT
21H
MOV
DL,
DH
INT
21H
MOV
DL,
20H
INT
21H
MOV
DL,
BH
INT
21H
第二题:先定义缓冲区存放结果,二进制转换为八进制
时,三位二进制为一位八进制,16位共6位;转16进制
时,4位二进制为一位16进制,共4位。显示要用ASCII码,
所以每一位占一个字节,共10个字节。所以至少定义10
字节的缓冲区。
BUFF
DB
20
DUP(?)
;定义20字节缓冲区
MOV
AX,
DATA
;将数据装入AX
MOV
DS,
AX
LEA
DI
OFFSET
BUFF
;DI指向缓冲区首字节
XOR
BX,
BX
;BX清零
MOV
CL,
9
;设置循环次序
ROL
AX,
1
;八进制首位转换
RCL
BX,
1
JMP
NEXT
BEGIN:
XOR
BX,
BX
;八进制其它5位转换
PUSH
CL
MOV
CL,
3
ONE:
ROL
AX,
1
RCL
BX,
1
LOOP
ONE
POP
CL
DEC
CL
JMP
NEXT
BEGIN2:XOR
BX,
BX
;16进制转换
PUSH
CL
MOV
CL,
4
TWO:
ROL
AX,
1
RCL
BX,
1
LOOP
TWO
POP
CL
DEC
CL
CMP
CL,
0
JE
NEXT2
NEXT:
AND
BX,
30H
;转ASCII码
MOV
[DI],BX
;储存
INC
DI
CMP
CL,
4
JA
BEGIN
JL
BEGIN2
MOV
[DI],20H
INC
DI
JMP
BEGIN2
NEXT2:MOV
DX,OFFSET
BUFF
;DX指向缓冲区首字节
MOV
AH,9
;9号功能调用
INT
21H
;我是初学者,有误的地方请各位指教
;将0200H位置的字节存储单元直接寻址传送到AL位置
;AL传送到AH暂存
AND AL,0FH ;清0高4位,低4位不变
OR AL,30H ;AL中的高4位变成3H,低4位不变
MOV BX,0201H ;假设(DS) = 0000H
MOV [BX],AL ;寄存器间接寻址,保存到目的位置
MOV AL,AH ;恢复
SHR AL,4 ;逻辑右移4位
AND AL,0FH ;
OR AL,30H ;同上,非压缩BCD数字,转成ASCII字符
MOV [BX+1],AL ;寄存器相对寻址
我写的有点长,经验证,运行无误。
代码贴在:任意两个10位以内十六进制数求和
http://tieba.baidu.com/f?kz=681706003
如是能用的,请顶一下。
为了方便修改,新代码直接贴在我的百度空间。
新代码添加了无输入处理和清除前导空格指令。
经验证,无楼主提到的‘1111111111+1111111111=42222222222’
的BUG,显示运算结果准确。
附言:21H的10号(0AH)功能,无法滤除:G~Z,所以不能用;
汤旺河边 错在: rcl al,1 ;把进位标志移入AL.
;参数
;SI:压缩BCD码存储单元的偏移地址
;DI:存储ASCII码的起始地址
BCD2AC PROC
PUSH AX
MOV AL,DS:[SI] ;取出压缩BCD码
MOV AH,AL ;复制一份
AND AX,0F00FH ;分别屏蔽高、低4位
SHR AH,4 ;产生原压缩BCD码高4位的ASCII码
MOV DS:[DI],AX ;保存结果
POP AX
RET ;返回
BCD2AC ENDP