| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 hosoo 于 2015-1-21 17:02 编辑  
 
assume cs:code,ds:data 
data segment 
   db 10 dup (0) 
data ends 
 
code segment 
 
         start: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 cx 
                 push si 
                 push ax 
                 push bx 
                 push dx 
           s: 
                mov cx,10                         ;除数BX的值为10          
                 call divdw                        ;执行divdw子程序 
                 push cx 
                 pop cx 
                 add cx,30h                         ;将余数加30H,得到十进制的ASCII码 
                 mov ds:[si],cl                     ;将DX放入数据段中 
                 inc si 
                 mov cx,ax                          ;将AX/BX的商放入CX中做JCXZ的循环条件 
                 jcxz ok                            ;JCXZ为0时程序跳转到标号为OK的偏移地址处                              
                 jmp short s                         ;跳转到标号为S的偏移地址处 
          ok: 
                 pop dx                              ;将DX、BX、AX、SI、CX出栈  
                 pop bx 
                 pop ax 
                 pop si 
                 pop cx 
                 ret 
                  
       divdw:push ax                ;将AX压栈 
                 mov ax,dx              ;将高16位放入AX中 
                 mov dx,0               ;DX置0,方便下面的程序 
                 div cx                 ;H/N得到的商在AX中,余数在DX中 
                 mov bx,ax              ;将AX的值保存在BX中 
                 pop ax                 ;将栈里面的AX出栈 
                 div cx                 ;L/N得到的商在AX中,(AX)低16位,余数在DX中 
                 mov cx,dx              ;将DX的值放入CX中,(CX)余数 
                 mov dx,bx              ;将BX的值放入DX中,(DX)高16位 
                 ret         
                  
show_str:push cx 
                 push si 
                 push ax 
                 push bx 
                 push dx 
                 mov ax,0b800h                        
                 mov es,ax                           ;把AX的值转给ES段 
                 mov ax,0a0h                         ;0A0H为每一行的值 
                 mov dx,6                           ;字符串显示在DX第6行  
                 mul dx                              ;将6乘以0A0h,AX得到第6行的偏移地址 
                 add ax,16 
                 mov di,ax                           ;将第八行的偏移地址放入DI中 
                 mov bp,0                            ;赋予ES的偏移地址BP为0  
                 jmp short show_ste                  ;跳转到SHOW_STR 
 show_ste:mov cl,ds:[si]                      ;将偏移地址为ES:SI的值放入CL中,并使CH为0,让JCXZ来判断es:[si]中的值是否为0,为0则跳转到标号为OK的偏移地址处 
               mov ch,0                             
               jcxz okk                                             ;不为0则向下执行 
               mov es:[bp+di],cl                             ;将(CL)的字符串放入es:[BP+DI]中 
               mov bl,02h                                       ;BL为绿色字体   
               mov es:[bp+di+1],bl                  
               inc si 
               add bp,2 
               jmp short show_ste                          ;跳转到SHOW_STE偏移地址处 
        okk:pop dx                                             ;将DX、BX、AX、SI、CX出栈 
              pop bx 
              pop ax 
              pop si 
              pop cx 
              ret                                                       ;从栈中取出IP的值后跳转到CS:IP处  
 
code ends 
end start 
 
 
当程序执行完标号:Dtoc时数据段里面的值为: 
 
 
 
当程序执行到标号show_str中这里的时候 
 
 
 
CL在debug时是36H,但是在CL放入es:[bp+di]中的时候,CL和BL的值怎么发生改变了,这是什么原因导致的,论坛里的大侠请指点一下,谢谢 
 
 
 
 
 
 |   
- 
 
 
 
 
 
 
 
 |