汇编语言
用汇编语言做。。要有设计说明、程序清单,软件流程框图,每一步的注解……发到我邮箱里810008677@qq.com。谢谢了啊。紧急……还可以追 加分值的!! 展开
;屏幕输出1000 以内同时满足如下条件的数:
;要求:个位数与十位数之和除以10 所得的余数等于百位数字用汇编语言做。。
;要有设计说明、程序清单,软件流程框图,每一步的注解……
;发到我邮箱里810008677@qq.com。谢谢了啊。紧急……还可以追 加分值的!!
data segment
n1 db 20 dup(0)
n db 0 ;有效位数
data ends
code segment
main proc far
assume cs:code,ds:data
start:
MOV AX,DATA
MOV DS,AX
push ds
MOV AX,1000
NEXT:
XOR DX,DX
MOV SI,OFFSET N1
PUSH AX
CALL DIV10
MOV BX,OFFSET N1
XOR AX,AX
mov al,n
cmp al,3 ;有百位吗?
jb nodisp ;没有,不显示
ADD BX,AX
DEC BX
MOV DL,[BX] ;取个位
DEC BX
MOV DH,[BX] ;取十位
SUB DX,3030H ;转换成数字
ADD DH,DL ;相加
CMP DH,10
JB NO_DA10 ;和大于10吗?
SUB DH,10 ;大于10则减10
NO_DA10:
DEC BX
MOV AL,[BX] ;取百位
SUB AL,30H
CMP AL,DH ;百位等于个位与十位的和吗?
JNZ NODISP ;不相等不显示
MOV AH,9 ;显示该数
MOV DX,OFFSET N1
INT 21H
mov ah,2
mov dl," " ;数与数间用两个空格隔开
int 21h
int 21h
nodisp:
POP AX
DEC AX
CMP AX,100
JA NEXT
exit:
MOV AH,4CH
INT 21H
main endp
;=====================
;=====================
;将32位16进制数(DX:AX)转换为10进制数子程序
;入口: DX:AX存32位16进制数, SI为存放转换后10进制数的首地址
;出口: 在SI中存放转换后10进制数的ASCII码,N为有效位数
DIV10 PROC NEAR
push ax
PUSH BX ;保护现场
PUSH CX
PUSH DI
MOV CX,0 ;每位10进制数进栈计数器
MOV BX,10D ;除数10
RE_DIV:
PUSH AX ;低16位进栈
MOV AX,DX ;先除高16位
MOV DX,0 ;高位置0
DIV BX ;商在AX中,是下一轮除的高位;余数在DX中,它和已进栈的AX(低16位)组成新的32位数
MOV DI,AX ;将下一轮除的高位保存在DI
POP AX ;取回先前进栈的低16位
DIV BX ;除后,商AX是下一轮的低16位,即(DI:AX)组成新的32位被除数;
;余数DX是一位已转换的10进制数
ADD DX,30H ;将其转换成ASCII码
PUSH DX ;将其进栈
INC CX ;进栈计数器加1
MOV DX,DI ;将高位商返回DX
CMP AX,0 ;判断商是否为0, DX:AX均需为0,实际上就是(DI:AX)这个新组成的32位被除数是否为0
jz down1 ;商低位为0
JMP RE_DIV ;商低位不为0,继续除10取余
down1:
cmp dx,0
jz down ;商低位(AX)为0,高位(DX)也为0
JMP RE_DIV ;否则继续除10取余
DOWN: ;当DX和AX均为0时(商为0),转结束除
MOV N,CL ;保存有效位数
L2:
POP [SI] ;以CX的值(进栈计数器)依次出栈
INC SI ;由于出栈的数仅低8位有效(高位为0),所以SI每次只增1,
;使新出栈的低8位有效值覆盖前一次出栈的高位0
LOOP L2
MOV AL,'$' ;在字符串尾部加结束标志
MOV [SI],AL
POP DI ;恢复现场
POP CX
POP BX
pop ax
RET
DIV10 ENDP
;========================
;========================
code ends
end start