lovegydx 发表于 2007-1-8 09:23
[求助]用汇编语言编九九乘法表程序!
在屏幕上显示如下:<BR>1*1= 1 <BR>1*2= 2 2*2= 4 <BR>1*3= 3 2*3= 6 3*3= 9 <BR>1*4= 4 2*4= 8 3*4=12 4*4=16 <BR>1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 <BR>1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 <BR>1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 <BR>1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 <BR>1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 <BR>在这里谢谢各位啦<BR>
lefttime 发表于 2007-1-11 18:08
<P>又是一道:来个例子吧<BR>CR MACRO ;换行宏<BR> MOV AH,2<BR> MOV DL,0AH<BR> INT 21H<BR> MOV DL,0DH<BR> INT 21H<BR> ENDM<BR>SHOW MACRO ;显示乘积的宏<BR> LOCAL NEXT1<BR> MOV AH,0<BR> AAM ;因为乘积最大为81,所以可采用BCD码乘法调整<BR> MOV DX,AX<BR> MOV AH,2<BR> OR DX,3030H<BR> XCHG DH,DL<BR> CMP DL,30H ;这里加了个判断,用于判断10位是否为零,例如乘积为09,则打头的零就不用输出<BR> JZ NEXT1<BR> INT 21H<BR>NEXT1: <BR> XCHG DH,DL<BR> INT 21H<BR> MOV DL,20H<BR> INT 21H<BR> ENDM<BR>DSEG SEGMENT<BR>SEN DB ?,'*',?,'= $' ;为输出乘式做准备,第一个问号处存放被乘数,第二个放乘数<BR>DSEG ENDS<BR>CSEG SEGMENT<BR> ASSUME CS:CSEG,DS:DSEG<BR>MAIN: MOV AX,DSEG<BR> MOV DS,AX<BR> MOV BL,1 ;在控制行数的同时,控制乘数的最大值(1-9)<BR>NEXT: MOV BH,BL <BR> INC BH ;这里的BH用于存放(BH)+1,用于控制被乘数的循环乘积<BR> MOV CL,1 ;CL存放被乘数,从1开始乘直到等于(BH)的值<BR>NEXT0: MOV AL,BL<BR> MOV AH,0<BR> MUL CL<BR> PUSH AX<BR> MOV AH,9<BR> MOV SEN,CL ;在这里开始存放显示的乘数、被乘数<BR> ADD SEN,30H<BR> MOV SEN+2,BL<BR> ADD SEN+2,30H<BR> LEA DX,SEN<BR> INT 21H ;输出乘式<BR> POP AX<BR> SHOW ;显示乘积<BR> INC CL<BR> CMP CL,BH<BR> JB NEXT0<BR> CR<BR> INC BL<BR> CMP BL,10<BR> JB NEXT<BR> MOV AX,4C00H<BR> INT 21H<BR>CSEG ENDS<BR> END MAIN<BR>相应的对比下简单的C语言例子:<BR>void main()<BR>{<BR> int i,j,m;<BR> for(i=1;i<10;i++)<BR> {<BR> for(j=1;j<i+1;j++)<BR> {<BR> m=i*j;<BR> printf("%d*%d= %d ",j,i,m);<BR> }<BR> printf("\n");<BR> }<BR> }</P>
流浪_汉 发表于 2007-1-21 00:39
<P>自己写的,就是没有上面的简单,可是比较容易看懂<BR>code segment<BR>main proc far<BR> assume cs:code<BR> push ds<BR> mov ax,0<BR> push ax<BR> mov bl,1<BR> lop2: mov bh,1<BR> lop1: mov al,bh<BR> mul bl<BR> aam //乘法调整指令<BR> add bh,30h //变为ASCII的值<BR> add bl,30h<BR> mov cx,ax<BR> mov dl,bh //显示被乘数<BR> mov ah,2<BR> int 21h<BR> mov dl,'*' //显示乘号<BR> mov ah,2<BR> int 21h<BR> mov dl,bl //显示乘数<BR> mov ah,2<BR> int 21h<BR> mov dl,'=' //显示等号<BR> mov ah,2<BR> int 21h<BR> cmp ch,0 //查看高位有没有值<BR> je diwei<BR> add ch,30h //若有显示<BR> mov dl,ch<BR> mov ah,2<BR> int 21h<BR>diwei:add cl,30h //显示低位<BR> mov dl,cl<BR> mov ah,2<BR> int 21h<BR> mov dl,' ' //显示空格<BR> mov ah,2<BR> int 21h<BR> sub bh,30h //将ASCII还原为BCD数<BR> sub bl,30h<BR> inc bh //将被乘数加一<BR> cmp bh,bl //比较看是不是要换行<BR> jna lop1<BR> mov dl,0ah //换行与置首位<BR> mov ah,2<BR> int 21h<BR> mov dl,0dh<BR> mov ah,2<BR> int 21h<BR> inc bl<BR> cmp bl,9 //比较是不是要结束<BR> jna lop2<BR> mov ah,4ch //返回<BR> int 21h<BR> main endp<BR> code ends<BR> end main<BR></P>
bh342633854 发表于 2007-5-11 14:17
<P>我也来发一个 大家多多指教 是我自己写的 <BR> .MODEL SMALL<BR> .STACK<BR> .DATA<BR>ET DB 0DH,0AH,'$'<BR>TEMP DB '?*?=??',' ','$'<BR> .CODE<BR> .startup<BR> <BR> MOV AL,31H<BR> MOV BL,30H</P>
<P>CC: PUSH AX<BR> PUSH BX<BR> INC BL<BR> MOV [TEMP],BL<BR> MOV [TEMP+2],AL<BR> SUB AL,30H<BR> SUB BL,30H<BR> MUL BL<BR> MOV BL,10<BR> DIV BL<BR> ADD AL,30H <BR> ADD AH,30H<BR> CMP AL,31H<BR> JL AA</P>
<P> MOV [TEMP+4],AL<BR> MOV [TEMP+5],AH<BR> JMP BB</P>
<P>AA: MOV AL,' '<BR> MOV [TEMP+4],AH<BR> MOV [TEMP+5],AL</P>
<P>BB: MOV DX,OFFSET TEMP<BR> MOV AH,09 <BR> INT 21H<BR> POP BX<BR> POP AX<BR> INC BX<BR> CMP BL,AL <BR> JNE CC</P>
<P> MOV BX,30H<BR> PUSH AX<BR> MOV DX,OFFSET ET<BR> MOV AH,09<BR> INT 21H<BR> POP AX<BR> INC AL<BR> CMP AL,39H<BR> JLE CC<BR> <BR> .EXIT 0<BR> END<BR></P>
页:
[1]