主题:我是初学者虚心请教各位谢谢回帖
yuhaiminggj
[专家分:0] 发布于 2006-03-12 21:22:00
我想写一个可以做九九乘法标的程序,并在屏幕上显示出乘法表,请大家帮我看看我写的错在哪里,非常谢谢
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC NEAR
MOV AX,DATA
MOV DS,AX
MOV CL,0AH
MOV AL,01H
MOV BL,01H
LOP0: MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,'*'
MOV AH,02H
INT 21H
MOV DL,BL
MOV AH,02H
INT 21H
MUL BL
MOV DL,AL
MOV AH,02H
INT 21H
INC BL
CMP BL,CL
JNZ LOP0
LOP1: INC AL
MOV BL,AL
CMP AL,CL
JNZ LOP0
MOV AH,4CH
INT 21H
START ENDP
CODE ENDS
END START
回复列表 (共3个回复)
沙发
p1s [专家分:4100] 发布于 2006-03-13 13:15:00
首先,改作main proc near,start应该是标号。然后main endp,否则两者冲突。
使用proc要push旧DS和一个0(AX中)。
过程没有ret,无法返回DOS了。
输出的是ASCII码啊,你直接输出1*1,那个1作为ASCII对应输出的就是一个空格了
所以除了乘号正常显示,别的都是乱码了……
另外,显然99乘法表要16-10进制转换,楼主再去找本书看看参考的程序。
板凳
sjs0714 [专家分:280] 发布于 2006-03-19 11:53:00
START是程序开始的标号,不能用作过程名.
当你用输出语句时,AL中的内容是会受到影响的.应该先把AL中的内容放到另一个位置.
当你想输出一个字符时,DL中应该放想输出字符的ASCII码.如果你想输出"1",DL中要放"31"才行.
计算机中两个数相乘的结果是十六进制,必须转化成十进制.输出十进制才能得到你想要的结果.
如果没用到数据段可以不用定义。
我帮你改了一下,你试试:
OUTW MACRO
OR DL,30H
MOV AH,02H
INT 21H
ENDM
CODE SEGMENT
ASSUME CS:CODE
START: MOV CL,0AH
MOV CH,01H
MOV BL,00H
LOP: INC BL
MOV DL,BL
OUTW
MOV DL,'*'
MOV AH,02H
INT 21H
MOV DL,CH
OUTW
MOV DL,3DH
MOV AH,02H
INT 21H
MOV AL,CH
MUL BL
AAM
MOV BH,AL
CMP AH,00H
JE NEXT
MOV DL,AH
OUTW
NEXT: MOV DL,BH
OUTW
MOV DL,' '
MOV AH,02H
INT 21H
CMP CH,BL
JNE LOP
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
INC CH
MOV BL,00H
CMP CL,CH
JNE LOP
MOV AH,4CH
INT 21H
CODE ENDS
END START
3 楼
pigtwo [专家分:0] 发布于 2006-04-22 12:52:00
.model small
.data
.stack ;九九乘法表的算法:双重循环,用bx做外循环,用ax做内循环,循环9次
.code
pro proc far
push ds
mov ax,0
push ax
mov ax,_data
mov ds,ax
mov al,1
mov bl,1
L1: cmp bl,9
jl L2 ;带符号数小于时转L2
jnl shuchu ;带符号数大于时转输出
inc bl ;修改bl
jmp L1
L2: cmp al,9
jl shuchu ;带符号数小于时转输出
inc al ;修改al
jmp L2
shuchu: mov dl,al ;输出
mov ah,02h
int 21h
MOV DL,'*'
MOV AH,02H
INT 21H
MOV DL,BL
MOV AH,02h
INT 21H
MUL BL
MOV DL,AL
MOV AH,02h
int 21h
ret
pro endp
end
我来回复