cpu遇到非法指令 求大神解答啊该怎么解决
cpu遇到非法指令 求大神解答啊
代码如下
date segment
arr db 20 dup(?)
pr1 db 'please input the word:$'
date ends
stack segment stack
db 100 dup(?)
stack ends
code segment
assume cs:code,ds:date,ss:stack
start:
mov ax,date
mov ds,ax
lea si,pr1
lo: ;输出开始字符
mov cl,[si]
call printf
inc si
mov ch,'$'
cmp [si],ch
jne lo
mov cl,0ah
call printf
lea si,arr
mov bh,'a'
sub bh,'0'
call input
mov [si],al
lo1: ;输入字符
inc si
call input
mov [si],al
cmp [si],bh
jne lo1
mov cl,0ah
call printf
mov bl,0
lea si,arr
lo2: ;寻找奇数
mov ch,01h
mov dh,[si]
and dh,ch
je sum
inc bl
sum:inc si
cmp [si],bh
jne lo2
mov al,bl
call printf
mov ax,4ch
int 21h
input proc
mov ah,01h
int 21h
sub al,'0'
ret
input endp
printf proc
push cx
mov dl,cl
mov ah,02h
int 21h
pop cx
ret
printf endp
code ends
end start
在谈到tddebug中正常 但是在dos中执行时 就抱错
------解决方案--------------------
主要问题是程序最后的结束功能调用应该是 mov ah, 4ch 吧,而不是 mov ax,4ch ,这是笔误吧。
另外,输出统计结果是,应先将数值转换为相应的字符;并且,printf 子程待输出的字符是在 cl 而非 al 中。
------解决方案--------------------
......
mov al,bl
call printf
mov ax,4c00h把这句改成:4c00h试一试.
int 21h
......
代码如下
date segment
arr db 20 dup(?)
pr1 db 'please input the word:$'
date ends
stack segment stack
db 100 dup(?)
stack ends
code segment
assume cs:code,ds:date,ss:stack
start:
mov ax,date
mov ds,ax
lea si,pr1
lo: ;输出开始字符
mov cl,[si]
call printf
inc si
mov ch,'$'
cmp [si],ch
jne lo
mov cl,0ah
call printf
lea si,arr
mov bh,'a'
sub bh,'0'
call input
mov [si],al
lo1: ;输入字符
inc si
call input
mov [si],al
cmp [si],bh
jne lo1
mov cl,0ah
call printf
mov bl,0
lea si,arr
lo2: ;寻找奇数
mov ch,01h
mov dh,[si]
and dh,ch
je sum
inc bl
sum:inc si
cmp [si],bh
jne lo2
mov al,bl
call printf
mov ax,4ch
int 21h
input proc
mov ah,01h
int 21h
sub al,'0'
ret
input endp
printf proc
push cx
mov dl,cl
mov ah,02h
int 21h
pop cx
ret
printf endp
code ends
end start
在谈到tddebug中正常 但是在dos中执行时 就抱错
------解决方案--------------------
主要问题是程序最后的结束功能调用应该是 mov ah, 4ch 吧,而不是 mov ax,4ch ,这是笔误吧。
另外,输出统计结果是,应先将数值转换为相应的字符;并且,printf 子程待输出的字符是在 cl 而非 al 中。
------解决方案--------------------
......
mov al,bl
call printf
mov ax,4c00h把这句改成:4c00h试一试.
int 21h
......