赞
踩
;多位数的输入输出 DATAS SEGMENT ;此处输入数据段代码 x dw ? n dw 10 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 db 100 dup(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;先把输入的字符串变为十进制数值 mov bx,0 ;存储到bx L1: mov ah,1 int 21h ;AL=输入数字的ascii码 cmp al,0dh ;0dh是回车 jz L2 ;输入结束 sub al,30h mov ah,0 xchg bx,ax mul n add bx,ax; jmp L1 L2: MOV dl,0dh ;DL为回车 MOV AH,2 INT 21H ;dl=输出字符 mov x,bx ;把输入的结果存到x mov ax,x mov bx,10 mov cx,0 mov dx,0 L3: div bx ;ax/bx,bx为除数,dx=余数 ax=商 push dx inc cx ;记录位数 cwd ;字转化为双字,al->ax cmp ax,0 ;被除数不为0继续 jnz L3 L4: pop dx add dl,'0' MOV AH,2 INT 21H loop L4 MOV AH,4CH INT 21H CODES ENDS END START
2、 从自然数1开始累加,直到累加和大于60000为止,显示累加的自然数的个数和累加和。显示格式为:1+2+…+n=sum
其中n为累加个数,sum为累加和。
stack segment db 10 dup(?) stack ends data segment n dw ? sum dw ? infor1 db "1+2+...+$" data ends code segment assume ds:data,cs:code,ss:stack start: mov ax,data mov ds,ax mov ax,0;存放累加和 mov bx,0;存放次数 loop1: inc bx add ax,bx cmp ax,60000;比较是否小于60000 jb loop1 mov n,bx mov sum,ax ;输出结果 mov dx,offset infor1 mov ah,09h int 21h ;输出多位数n mov ax,n mov cx,0 ;记录位数 mov bx,10;用来取余 mov dx,0 loop2: div bx ;ax/bx,ax=商,dx=余数 push dx ;余数入栈! inc cx; 位数加1 cwd ;al->ax cmp ax,0 jnz loop2;ax不为0 loop3: pop dx ;从栈里面输出,出栈到dx(16位!) add dl,'0' mov ah,02h int 21h loop loop3 ;输出= mov dl,'=' mov ah ,02h int 21h ;输出多位数sum mov ax,sum mov cx,0 ;记录位数 mov bx,10;用来取余 mov dx,0 loop4: div bx ;ax/bx,ax=商,dx=余数 push dx ;余数入栈! inc cx; 位数加1 cwd ;al->ax cmp ax,0 jnz loop4;ax不为0 loop5: pop dx ;从栈里面输出,出栈到dx(16位!) add dl,'0' mov ah,02h int 21h loop loop5 mov ah,4ch int 21h code ends end start
3,计算1+2+…+n=?,其中n通过键盘输入,累加和小于216。要求在屏幕上提供如下信息:
Please input a number(1-361): ;出现此信息后通过键盘输入一个小于362的无符号整数,
;使累加和小于一个16位无符号二进制数所能表示的范围
1+2+…+n=sum ;其中n为用户输入的数,sum为所求的累加和
DATA SEGMENT INF1 DB "Please input a number (1-361):$" IBUF DB 7,0,6 DUP(?) OBUF DB 6 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV CX, AX mov dx,offset INF1;输出提示信息 mov ah,09h int 21h mov dx,offset IBUF;输入一个十进制数 mov ah,0ah;键入并显示字符串 int 21h mov cl,IBUF+1 ;十进制数的位数送cx mov ch ,0 mov si,offset IBUF+2;指向输入的第一个字符(最高位) mov ax,0;开始将十进制数转换为二进制数 again: mov dx,10 ;((0*10+a4)*10+…)*10+a0 mul dx ;ax*dx and byte ptr[si],0fh add al,[si] adc ah,0 inc si loop again mov cx,ax mov ax,0 mov bx,1 loop2: add ax,bx inc bx loop loop2 mov bx,offset OBUF+5 MOV BYTE PTR [BX],'$' MOV CX, 10 ;做(DX):(AX)/10运算 LOOP1: MOV DX, 0 ;被除数高16位清0 DIV CX ADD DL, 30H ;将DL中的一位十进制数转换为ASCII码 DEC BX MOV [BX], DL OR AX, AX JNZ LOOP1 ;判断商是否为0,不为0继续 mov dl,0ah;换行 mov ah,02h int 21h MOV DX, BX ;显示转换得到的十进制数 MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ends end START
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。