assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 320 dup (0)
stack ends
code segment
main:mov ax,stack
mov ss,ax
mov sp,640
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push si
push dx
push cx
push bx
push ax
mov bx,10
s0:mov dx,0
div bx
add dl,30
mov ds:[si],dl ;该指令和上一条指令其实可以删掉的,因为我这段设计的目的是计算出AX寄存器 中十进制数的位数,记录在SI中。因为现在执行的结果是data:00:36 36 36 32 31,如果输出在屏幕上字符串会是“66621”。
mov cx,ax
jcxz ok0
inc si
jmp short s0
ok0:inc si ;执行后获得ax数值十进制的位数,目的是作为循环次数使用。
mov byte ptr [si],0
mov cx,si
mov bx,10
pop ax
push ax
s1: dec si
mov dx,0
div bx
add dx,30
mov ds:[si],dl
loop s1 ;该循环体的作用是调整DATA:0000处的字符串ASCII码顺序为"12666”。
pop ax
pop bx
pop cx
pop dx
pop si
ret
show_str:push ax
push es
mov ah,0
mov al,160
mul dh
add dl,dl
sub dl,2
mov dh,0
add ax,dx
mov di,ax
mov ax,0B800H
mov es,ax
s2:mov al,ds:[si]
push cx
mov ch,0
mov cl,al
jcxz ok1
mov es:[di],al
inc di
pop cx
mov es:[di],cl
inc di
inc si
jmp near ptr s2
ok1:pop es
pop ax
ret
code ends
end main
说明:show_str子程序已经在实验10(2)中具体应用过,而且程序正常运行,没用问题。
程序编译和连接都没有任何问题,但是运行程序的时候会提示“ntvdm cpu 遇到无效的指令 CS:...,IP:... OP.....”以前也遇到过这种问题,在网上查了,说是栈空间不够,所以我就修改了栈段的定义,问题解决了,但是这一次却不行,求大神能帮忙解答一下!!!这是什么问题造成的,应该如何解决? |