. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->基础知识
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  10 章 实验3 debug 跟踪正常。dos加载运行显示溢出 ???  [已解决] 回复[ 2次 ]   点击[ 530次 ]  
renbin823
[帖 主]   [ 发表时间:2011-05-28 12:06 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2011-05-14 08:56
assume cs:code 

data segment 
  db 10 dup (0) 
data ends 

stack segment 
   db 32 (0) 
stack ends 


code segment 
start: mov ax,12666 

       mov bx,data  ;初始化数据段 
       mov ds,bx 
       sub si,si 

       mov bx,stack ;初始化栈 
       mov ss,bx 
       mov sp,32 

       call dtoc    ;调用子列程 dtoc 算出十进制的ascii码 
          
       mov dh,8     ;设置 行 列 属性 
       mov dl,3 
       mov cl,2 

       call show_str ;调用子列程 show_str 显示字符串  


       mov ax,4c00h  ;程序返回 
       int 21h 

dtoc: push bx        ;压栈寄存器中的数据 
      push cx 
      push dx 
      push di 

      mov bx,0ah     ;参数除(bx)取余加30h 得ascii 码 
   s: div bx 
      add dx,30h 
      mov [si],dl    ;将asc2 送入内存 ds:[si] 
      mov cx,ax      ;将商赋给cx cx<>0 继续循环 
      jcxz ret0      ;cx=0 则跳转到标号处 
      inc si         ;(si)=(si)+1 偏移地址指向下内存单元 
      sub dx,dx      ;dx=dx-dx 初始化dx dx+ax组成新的16 
                     ;位被除数 
      jmp short s    

ret0: pop di         ;出栈各个寄存器的数据 
      pop dx 
      pop cx 
      pop bx 
      ret            ;返回 

show_str: push ax    ;压栈各个寄存器的数据 
          push bx 
          push cx 
          push dx 
          push si 
          push di 
          push es 

          mov ax,0b800h ;初始化显存段地址 
          mov es,ax 

          mov al,160    ;al*dh+dl 得出显存的偏移地址 
          inc dh        ;行号是从0开始所以8行应该是8+1 
          mul dh 
          sub dh,dh 
          add dx,dx 
          add ax,dx 
          mov di,ax     ;将偏移地址赋给di 


          mov ss:[0],cl ;将属性送入到内存 
      s1: mov al,[si]   ;将内存ds:[si]单元内的数据送入al 
          mov ah,ss:[0] ;将内存ss:[0]单元中存放的属性送入 
                              ah 
          mov es:[di],ax ;将(ax)送入显存es:[di] 
          mov cx,si      ;将si的偏移地址赋给cx cx<>0 继续 
                            ;循环 否则跳转到标号 
          jcxz ret1 
          dec si        ; (si)=(si)-1 
          add di,2      ;(di)=(di)+2 
          jmp short s1 

    ret1: pop es        ; 出栈 
          pop di 
          pop si 
          pop dx 
          pop cx 
          pop bx 
          pop ax 
          ret assume cs:code 

data segment 
  db 10 dup (0) 
data ends 

stack segment 
   db 32 (0) 
stack ends 


code segment 
start: mov ax,12666 

       mov bx,data  ;初始化数据段 
       mov ds,bx 
       sub si,si 

       mov bx,stack ;初始化栈 
       mov ss,bx 
       mov sp,32 

       call dtoc    ;调用子列程 dtoc 算出十进制的ascii码 
          
       mov dh,8     ;设置 行 列 属性 
       mov dl,3 
       mov cl,2 

       call show_str ;调用子列程 show_str 显示字符串  


       mov ax,4c00h  ;程序返回 
       int 21h 

dtoc: push bx        ;压栈寄存器中的数据 
      push cx 
      push dx 
      push di 

      mov bx,0ah     ;参数除(bx)取余加30h 得ascii 码 
   s: div bx 
      add dx,30h 
      mov [si],dl    ;将asc2 送入内存 ds:[si] 
      mov cx,ax      ;将商赋给cx cx<>0 继续循环 
      jcxz ret0      ;cx=0 则跳转到标号处 
      inc si         ;(si)=(si)+1 偏移地址指向下内存单元 
      sub dx,dx      ;dx=dx-dx 初始化dx dx+ax组成新的16 
                     ;位被除数 
      jmp short s    

ret0: pop di         ;出栈各个寄存器的数据 
      pop dx 
      pop cx 
      pop bx 
      ret            ;返回 

show_str: push ax    ;压栈各个寄存器的数据 
          push bx 
          push cx 
          push dx 
          push si 
          push di 
          push es 

          mov ax,0b800h ;初始化显存段地址 
          mov es,ax 

          mov al,160    ;al*dh+dl 得出显存的偏移地址 
          inc dh        ;行号是从0开始所以8行应该是8+1 
          mul dh 
          sub dh,dh 
          add dx,dx 
          add ax,dx 
          mov di,ax     ;将偏移地址赋给di 


          mov ss:[0],cl ;将属性送入到内存 
      s1: mov al,[si]   ;将内存ds:[si]单元内的数据送入al 
          mov ah,ss:[0] ;将内存ss:[0]单元中存放的属性送入 
                              ah 
          mov es:[di],ax ;将(ax)送入显存es:[di] 
          mov cx,si      ;将si的偏移地址赋给cx cx<>0 继续 
                            ;循环 否则跳转到标号 
          jcxz ret1 
          dec si        ; (si)=(si)-1 
          add di,2      ;(di)=(di)+2 
          jmp short s1 

    ret1: pop es        ; 出栈 
          pop di 
          pop si 
          pop dx 
          pop cx 
          pop bx 
          pop ax 
          ret 
           
code ends 
end start
renbin823
[第1楼]   [ 回复时间:2011-05-28 12:07 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2011-05-14 08:56
不好意思多粘贴了一次。
renbin823
[第2楼]   [ 回复时间:2011-05-28 13:57 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2011-05-14 08:56
此贴由 贴主 于 [ 2011-05-28 13:57 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved