|
主题 : : debug运行成功,直接运行exe进入死循环,跳不出来,求解,(10.2改动测试把dd数据显示出来),程式如下 [待解决] |
回复[ 2次 ]
点击[ 163次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2019-05-08 16:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2019-05-08 16:38 |
assume cs:codesg,ds:data,ss:stack
data segment
dd 112666,133333,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data ends
stack segment
db 220 dup(0)
stack ends
codesg segment
start:
mov bx,stack
mov ss,bx
mov sp,40h
mov bx,data
mov ds,bx
mov si,0
mov bx,0
mov dx,0
mov cx,0
mov ax,0
call dtoc
mov dh,1
mov dl,4
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc : push bx
push si
push cx
mov bx,0
mov si,0
mov dx,0
mov cx,0
mov ax,0
dtoc2 :
mov ax,ds:[bx]
mov dx,ds:[bx+2]
dtoc3 : mov cx,10
call divdw
add cl,30h
push cx
mov cx,ax
jcxz dt1
inc bp
jmp dtoc3
dt1:
mov cx,dx
jcxz ok2
inc bp
jmp dtoc3
ok2: inc bp
ok3:
pop cx
mov byte ptr [si+10h],cl
sub bp,1
mov cx,bp
jcxz ok4
inc si
jmp ok3
ok4:
inc si
mov byte ptr [si+10h],20h
inc bx
inc bx
inc bx
inc bx
mov cx,[bx]
jcxz ok5
inc si
mov bp,0
jmp dtoc2
ok5:
mov cx,[bx+2]
jcxz ok6
inc si
mov bp,0
jmp dtoc2
ok6: pop cx
pop si
pop bx
ret
divdw: push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
show_str: push bx
push si
push cx
mov bx,0
mov ax,0B800H
mov es,ax
sub dh,1
mov al,dh
mov bl,0A0H
mul bl
add bx,ax
push bx
sub dl,1
mov al,dl
mov bl,2
mul bl
pop bx
add bx,ax
show_str2:
mov cl,[si+10h]
mov ch,0
jcxz ok
mov al,[si+10h]
mov ah,0
mov es:[bx],al
pop cx
mov ch,0
mov byte ptr es:[bx+1],cl ;颜色
push cx
inc bx
inc bx
inc si
jmp show_str2
ok:
pop cx
pop si
pop bx
ret
codesg ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2019-05-09 09:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2019-05-08 16:38 |
自己弄出来了,就是没有初始化bp的值,副程式如下
assume cs:codesg,ds:data,ss:stack
data segment
dd 112666,133333,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data ends
stack segment
db 96 dup(0)
stack ends
codesg segment
start:
mov bx,stack
mov ss,bx
mov sp,60h
mov bx,data
mov ds,bx
mov si,0
mov bx,0
mov dx,0
mov cx,0
mov ax,0
call dtoc
mov dh,1 ;行号
mov dl,4 ;列号
mov cl,2 ;颜色
call show_str
mov ax,4c00h
int 21h
dtoc : push bx
push si
push cx
mov bx,0
mov si,0
mov dx,0
mov cx,0
mov ax,0
mov bp,0 ;初始化
dtoc2 :
mov ax,ds:[bx] ;把第一个数低位付给ax
mov dx,ds:[bx+2] ;把第一个数高位位付给dx
dtoc3 : mov cx,10 ;除数为10
call divdw
add cl,30h ;余数低位+30h输出数字
push cx ;存入数字
mov cx,ax
jcxz dt1 ;把商的低位给cx,为0则跳dt1,否则继续
inc bp ;bp记录有多少个数字
jmp dtoc3 ;跳dtoc3不断转换数字
dt1:
mov cx,dx ;把商的高位给dx,为0则跳OK2,否则继续
jcxz ok2
inc bp ;bp记录有多少个数字
jmp dtoc3 ;跳dtoc3不断转换数字
ok2: inc bp ;bp+1才是转换的数字的字节
ok3:
pop cx ;取出存入的cx值,倒着读余数
mov byte ptr [si+10h],cl ;cx低字节,余数存入ds:10h地址
sub bp,1 ;bp-1少了一个转换字节
mov cx,bp ;bp赋给cx
jcxz ok4 ;转换完则跳ok4,否则继续执行
inc si ;下个地址
jmp ok3
ok4:
inc si
mov byte ptr [si+10h],20h ;空一格
inc bx
inc bx
inc bx
inc bx
mov cx,[bx] ;第二个dd数低位看是否为零,
jcxz ok5 ;等于零则跳ok5,不等则继续读下个数
inc si
mov bp,0 ;bp清零,si+1存入下个字节
jmp dtoc2
ok5:
mov cx,[bx+2] ;第二个dd数高位看是否为零,
jcxz ok6 ;等于零则跳ok6,不等则继续读下个数
inc si
mov bp,0 ;bp清零,si+1存入下个字节
jmp dtoc2
ok6: pop cx
pop si
pop bx
ret
divdw: push bx ;压bx入寨
push ax
mov ax,dx ;按公式先把高位赋予ax做除法
mov dx,0 ;dx清零
div cx ;除以cx
mov bx,ax ;商ax保留到bx中
pop ax ;取出低位的值ax,高位是dx,上一次除法的余数
div cx ;除以cx
mov cx,dx ;余数就给cx
mov dx,bx ;高位bx赋予dx,低位ax,
pop bx
ret
show_str: push bx
push si
push cx ;保存cx值
mov bx,0
mov ax,0B800H
mov es,ax
sub dh,1
mov al,dh ;al=(dh-1)
mov bl,0A0H
mul bl ;ax=(dh-1)*A0
add bx,ax ;BX=(dh-1)*A0
push bx ;存bx值
sub dl,1
mov al,dl ;al=(dl-1)
mov bl,2
mul bl ;ax=(dl-1)*2
pop bx ;取出第一个bx值
add bx,ax ;bx=(dh-1)*A0+(dl-1)*2
show_str2:
mov cl,[si+10h] ;把ds:[si+10h]赋给cl
mov ch,0
jcxz ok ;cx=0则结束转换,否则继续执行
mov al,[si+10h] ;把ds:[si+10h]赋给al
mov ah,0
mov es:[bx],al ;把al的值存到显存中
pop cx ;取出cx值
mov ch,0
mov byte ptr es:[bx+1],cl ;cl值赋予颜色
push cx ;保存cx值
inc bx
inc bx ;指向显存下个地址
inc si ;下个要转换的字节
jmp show_str2
ok:
pop cx
pop si
pop bx
ret
codesg ends
end start
[图片] | | |
|
|
|
|
[第2楼]
[ 回复时间:2019-05-09 09:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2019-05-08 16:38 |
自己弄出来了,就是没有初始化bp的值,副程式如下
assume cs:codesg,ds:data,ss:stack
data segment
dd 112666,133333,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data ends
stack segment
db 96 dup(0)
stack ends
codesg segment
start:
mov bx,stack
mov ss,bx
mov sp,60h
mov bx,data
mov ds,bx
mov si,0
mov bx,0
mov dx,0
mov cx,0
mov ax,0
call dtoc
mov dh,1 ;行号
mov dl,4 ;列号
mov cl,2 ;颜色
call show_str
mov ax,4c00h
int 21h
dtoc : push bx
push si
push cx
mov bx,0
mov si,0
mov dx,0
mov cx,0
mov ax,0
mov bp,0 ;初始化
dtoc2 :
mov ax,ds:[bx] ;把第一个数低位付给ax
mov dx,ds:[bx+2] ;把第一个数高位位付给dx
dtoc3 : mov cx,10 ;除数为10
call divdw
add cl,30h ;余数低位+30h输出数字
push cx ;存入数字
mov cx,ax
jcxz dt1 ;把商的低位给cx,为0则跳dt1,否则继续
inc bp ;bp记录有多少个数字
jmp dtoc3 ;跳dtoc3不断转换数字
dt1:
mov cx,dx ;把商的高位给dx,为0则跳OK2,否则继续
jcxz ok2
inc bp ;bp记录有多少个数字
jmp dtoc3 ;跳dtoc3不断转换数字
ok2: inc bp ;bp+1才是转换的数字的字节
ok3:
pop cx ;取出存入的cx值,倒着读余数
mov byte ptr [si+10h],cl ;cx低字节,余数存入ds:10h地址
sub bp,1 ;bp-1少了一个转换字节
mov cx,bp ;bp赋给cx
jcxz ok4 ;转换完则跳ok4,否则继续执行
inc si ;下个地址
jmp ok3
ok4:
inc si
mov byte ptr [si+10h],20h ;空一格
inc bx
inc bx
inc bx
inc bx
mov cx,[bx] ;第二个dd数低位看是否为零,
jcxz ok5 ;等于零则跳ok5,不等则继续读下个数
inc si
mov bp,0 ;bp清零,si+1存入下个字节
jmp dtoc2
ok5:
mov cx,[bx+2] ;第二个dd数高位看是否为零,
jcxz ok6 ;等于零则跳ok6,不等则继续读下个数
inc si
mov bp,0 ;bp清零,si+1存入下个字节
jmp dtoc2
ok6: pop cx
pop si
pop bx
ret
divdw: push bx ;压bx入寨
push ax
mov ax,dx ;按公式先把高位赋予ax做除法
mov dx,0 ;dx清零
div cx ;除以cx
mov bx,ax ;商ax保留到bx中
pop ax ;取出低位的值ax,高位是dx,上一次除法的余数
div cx ;除以cx
mov cx,dx ;余数就给cx
mov dx,bx ;高位bx赋予dx,低位ax,
pop bx
ret
show_str: push bx
push si
push cx ;保存cx值
mov bx,0
mov ax,0B800H
mov es,ax
sub dh,1
mov al,dh ;al=(dh-1)
mov bl,0A0H
mul bl ;ax=(dh-1)*A0
add bx,ax ;BX=(dh-1)*A0
push bx ;存bx值
sub dl,1
mov al,dl ;al=(dl-1)
mov bl,2
mul bl ;ax=(dl-1)*2
pop bx ;取出第一个bx值
add bx,ax ;bx=(dh-1)*A0+(dl-1)*2
show_str2:
mov cl,[si+10h] ;把ds:[si+10h]赋给cl
mov ch,0
jcxz ok ;cx=0则结束转换,否则继续执行
mov al,[si+10h] ;把ds:[si+10h]赋给al
mov ah,0
mov es:[bx],al ;把al的值存到显存中
pop cx ;取出cx值
mov ch,0
mov byte ptr es:[bx+1],cl ;cl值赋予颜色
push cx ;保存cx值
inc bx
inc bx ;指向显存下个地址
inc si ;下个要转换的字节
jmp show_str2
ok:
pop cx
pop si
pop bx
ret
codesg ends
end start
[图片] | | |
|