. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  debug运行成功,直接运行exe进入死循环,跳不出来,求解,(10.2改动测试把dd数据显示出来),程式如下  [待解决] 回复[ 2次 ]   点击[ 163次 ]  
wxc
[帖 主]   [ 发表时间: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
wxc
[第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
[图片]
wxc
[第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
[图片]
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved