实验十 这个程序为什么不能再屏幕显示字符? 哪错了? 数据放入现存的地址不对吗?
assume cs:code,ds:data,ss:stackdata segment
db 16 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,12666
mov si,0
call dtoc
mov dh,8
mov dl,3
mov si,0
mov bl,2
call show_str
mov ax,4c00h
int 21h
dtoc: mov dx,0
mov bx,10
div bx
mov cx,ax
add dx,30h
push dx
inc si
jcxz dtoc_ok
jmp short dtoc
dtoc_ok: mov cx,si
mov si,0
dtoc_s: pop bx
mov ds:,bl
inc si
loop dtoc_s
mov ds:,byte ptr 0
ret
show_str: mov al,160
mul dh
dec ax
mov dx,ax
mov al,2
mul dl
dec ax
add ax,dx
add ax,0b800h
mov es,ax
mov bp,0
mov ch,0
show_s: mov cl,ds:
jcxz show_ok
mov es:,cl
mov es:,bl
inc si
add bp,2
jmp short show_s
show_ok: ret
code ends
end start
assume cs:code,ds:data,ss:stack
data segment
db 16 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,data ax=data
mov ds,ax ds=data
mov ax,stack ax=stack
mov ss,ax ss=stack
mov sp,16 sp=16
mov ax,12666 ax=12666
mov si,0 si=0
call dtoc 跳到标号处
返回后,ax=0,bx=6,cx=0,dx=36h,si=5
data:0=31hdata:1~4=36h,data:5~15=0
mov dh,8
mov dl,3
mov si,0
mov bl,2 bx=2
call show_str 跳到标号处
返回后各内存值:
bd04:0=31h,bd04:1~8=36h
(这个就是你执行后的结果了)
mov ax,4c00h
int 21h
dtoc: mov dx,0 dx=0......
mov bx,10 bx=10.....
div bx ax=1266,dx=6,ax=126,dx=6,....ax=0,dx=1
mov cx,ax cx=1266,cx=126,cx=12,cx=1,cx=0
add dx,30h dx=36h,dx=36h,dx=36h,dx=36h,dx=31h
push dx pop 36,pop 366,pop 36h,pop36h,pop31h
inc si si=1,si=2,si=3,si=4,si=5
jcxz dtoc_ok 第5次cx=0,跳
jmp short dtoc 此处跳转4次
dtoc_ok: mov cx,si cx=5
mov si,0 si=0
dtoc_s: pop bx bx=31h 第二次:bx=36h ..........bx=36h
mov ds:,bl data:0=31h data:1=36h .........一直到data:4=36h
inc si si=1 si=2 ..........
loop dtoc_s 跳4次 si最后=5
mov ds:,byte ptr 0 data:5和data:6的值无改变,为0
ret 返回
show_str:mov al,160 al=160=a0h
mul dh ax=1280
dec ax ax=1279
mov dx,ax dx=1279
mov al,2 al=2
mul dl ax=6
dec ax ax=5
add ax,dx ax=1284
add ax,0b800h ax=bd04h
mov es,ax es=bd04h
mov bp,0 bp=0
mov ch,0 ch=0
show_s: mov cl,ds: cl=data:0=31h 第二次:cl=data:1=36h....cl=data:4=36h cl=data:5=0
jcxz show_ok cx=31h cx=36h ....cl=36h cx=0 跳
mov es:,cl bd04:0=31h, bd04:2=36h ....bd04:8=36h
即第7行第2个
从第0行第0个开始数
mov es:,bl bd04:1=36h bd04:3=36h ....bd04:7=36h
inc si si=1 si=2 ....si=5
add bp,2 bp=2 bp=4 ....bp=10
jmp short show_s 跳 跳 ....不跳
show_ok: ret 返回
code ends
end start
本帖最后由 jianqitao 于 2012-7-1 01:35 编辑
编译时通过的,我帮你人肉单步跟踪调试了一下,错误挺多,自己看吧
assume cs:code,ds:data,ss:stack
data segment
db 16 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,data ax=data
mov ds,ax ds=data
mov ax,stack ax=stack
mov ss,ax ss=stack
mov sp,16 sp=16
mov ax,12666 ax=12666
mov si,0 si=0
call dtoc 跳到标号处
返回后,ax=1266,bx=6,cx=0,dx=36h,si=2
data:0=6,data:1=6,其他内存和寄存器无变化
mov dh,8
mov dl,3
mov si,0
mov bl,2 bx=2
call show_str 跳到标号处
返回后各内存值:data:0=6,data:1=6,data:3~15=0
bd04:0=6,bd04:1=6,其他为0,无变化
(这个就是你执行后的结果了)
mov ax,4c00h
int 21h
dtoc: mov dx,0 dx=0 dx=0
mov bx,10 bx=10 bx=10
div bx ax=1266,dx=6 ax=126,dx=6
mov cx,ax cx=1266 cx=126
add dx,30h dx=36h dx=36h
push dx push 6
inc si si=1
jcxz dtoc_ok cx=1266 ,cx不为0
jmp short dtoc 跳回去
dtoc_ok: mov cx,si cx=1
mov si,0 si=0
dtoc_s: pop bx bx=6 第二次:bx=6
mov ds:,bl data:0=6 data:1=6
inc si si=1 si=2
loop dtoc_s 执行后cx=0,跳回去 退出循环cx=0
mov ds:,byte ptr 0 data:2和data:3的值无改变,为0
ret 返回
show_str:mov al,160 al=160=a0h
mul dh ax=1280
dec ax ax=1279
mov dx,ax dx=1279
mov al,2 al=2
mul dl ax=6
dec ax ax=5
add ax,dx ax=1284
add ax,0b800h ax=bd04h
mov es,ax es=bd04h
mov bp,0 bp=0
mov ch,0 ch=0
show_s: mov cl,ds: cl=data:0=6 第二次:cl=data:1=6 第三次:cl=data:2=0
jcxz show_ok cx=6 cx=6 cx=0 跳
mov es:,cl bd04:0=6, bd04:2=6
即第7行第2个
从第0行第0个开始数
mov es:,bl bd04:1=6 bd04:3=6
inc si si=1 si=2
add bp,2 bp=2 bp=4
jmp short show_s 跳 跳
show_ok: ret 返回
code ends
end start
jianqitao 发表于 2012-7-1 00:33 static/image/common/back.gif
编译时通过的,我帮你人肉单步跟踪调试了一下,错误挺多,自己看吧
assume cs:code,ds:data,ss:stack
dat ...
F:\dm F:\dm\未命名.jpg 之前的答案有错哦,我再帮你看一下
页:
[1]