. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10 编写子程序编译通过,结果让我失望了!!  [待解决] 回复[ 7次 ]   点击[ 536次 ]  
thedaydreamwang
[帖 主]   [ 发表时间:2010-01-21 01:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
assume cs:code
data segment
     db 'welcome to masm!',0
data ends
 code segment
       start :  mov dh,8
                  mov dl,3
                   mov cl,2
                   mov ax,data
                   mov ds,ax
                   mov si,0
                   call show_str
                   mov ax,4c00h
                    int 21h
           show_str:     dec dh
                             dec dl
                              mov ax,0
                              mov al,dh
                              mov bx,0
                              mov bl,10
                              mul bl
                              mov bx,ax
                               mov ax,0b800h
                               add ax,bx
                                mov es,ax
                               mov ax,0
                               mov  al,dl
                               add al,dl
                               mov bx,ax
                               mov di,0
                    ok:       mov  ch,cl 
                                mov cl,[si]
                                push cx
                                 mov ch,0
                                  jcxz return
                                  pop es:[bx+di]
                                  add di,2
                                  inc si
                                  jmp short ok
                    return:     ret
  code ends
  end start
thedaydreamwang
[第1楼]   [ 回复时间:2010-01-21 01:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
发错了这个是修改过的
assume cs:code
data segment
     db 'welcome to masm!',0
data ends
 code segment
       start :  mov dh,8
                  mov dl,3
                   mov cl,2
                   mov ax,data
                   mov ds,ax
                   mov si,0
                   call show_str
                   mov ax,4c00h
                    int 21h
           show_str:     dec dh
                             dec dl
                              mov ax,0
                              mov al,dh
                              mov bx,0
                              mov bl,10
                              mul bl
                              mov bx,ax
                               mov ax,0b800h
                               add ax,bx
                                mov es,ax
                               mov ax,0
                               mov  al,dl
                               add al,dl
                               mov bx,ax
                               mov di,0
                               mov  ch,cl 
                  ok:        mov cl,[si]
                                push cx
                                 mov ch,0
                                  jcxz return
                                  pop es:[bx+di]
                                  add di,2
                                  inc si
                                  jmp short ok
                    return:     ret
  code ends
  end start
thedaydreamwang
[第2楼]   [ 回复时间:2010-01-21 01:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
运行出错不知道错在哪,这几天还在找方法检查自已写的错误!!
versaariel
[第3楼]   [ 回复时间:2010-01-21 08:58 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
CMD下报错,是因为没设置堆栈,DEBUG默认SS=DS=CS,开头加两句
start: mov ax,2000h
       mov ss,ax
       mov sp,100h
//下面是你的程序
thedaydreamwang
[第4楼]   [ 回复时间:2010-01-26 01:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
-t
AX=0004  BX=0004  CX=0000  DX=0702  SP=00FC  BP=0000  SI=0010  DI=0020
DS=2196  ES=B846  SS=2000  CS=2198  IP=0048  NV UP DI PL NZ AC PO NC
2198:0048 B500             MOV     CH,00h
Trace Interrupt
-t
AX=0004  BX=0004  CX=0000  DX=0702  SP=00FC  BP=0000  SI=0010  DI=0020
DS=2196  ES=B846  SS=2000  CS=2198  IP=004A  NV UP DI PL NZ AC PO NC
2198:004A E309             JCXZ    0055  ;yes
Trace Interrupt
-t
AX=0004  BX=0004  CX=0000  DX=0702  SP=00FC  BP=0000  SI=0010  DI=0020
DS=2196  ES=B846  SS=2000  CS=2198  IP=0055  NV UP DI PL NZ AC PO NC
2198:0055 C3               RET
Trace Interrupt
-t
AX=0004  BX=0004  CX=0000  DX=0702  SP=00FE  BP=0000  SI=0010  DI=0020
DS=2196  ES=B846  SS=2000  CS=2198  IP=0720  NV UP DI PL NZ AC PO NC
2198:0720 0000             ADD     [BX+SI],AL
Trace Interrupt
按照楼上的意思加了有了一些进展,结果只显示了一个字符w,于是用debug跟踪如上,到ret 的时候结果出问题了!!不知道是哪里写错了!!
thedaydreamwang
[第5楼]   [ 回复时间:2010-01-26 01:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
找到原因了是因为自已的逻辑有部题!!呵呵!!
thedaydreamwang
[第6楼]   [ 回复时间:2010-01-26 19:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
经过一晚上的努务终与完成了呵呵真不容易发现自已的错误大家都来恭喜我吧代码始下 

assume cs:code  
data segment  
     db 'welcome to masm!',0  
data ends  
 code segment 
start: mov ax,data 
                  mov ss,ax  
                  mov sp,200h 
                  mov dh,8  
                  mov dl,3  
                   mov cl,2  
                   mov ds,ax  
                   mov si,0  
                   call show_str  
                   mov ax,4c00h  
                    int 21h  
           show_str:     dec dh  
                             dec dl  
                              mov ax,0  
                              mov al,dh  
                              mov bx,0  
                              mov bl,10  
                              mul bl  
                              mov bx,ax  
                               mov ax,0b800h  
                               add ax,bx  
                                mov es,ax  
                               mov ax,0  
                               mov  al,dl  
                               add al,dl  
                               mov bx,ax  
                               mov di,0  
                               mov  ch,cl   
                  ok:        mov cl,[si]  
                                push cx  
                                 mov ch,0  
                                  jcxz return  
                                  pop cx 
                                   mov es:[bx+di],cx 
                                  add di,2  
                                  inc si  
                                  jmp short ok  
                    return:   pop cx 
                                 ret 
  code ends  
  end start
thedaydreamwang
[第7楼]   [ 回复时间:2010-02-06 02:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
继续前断时间的问题,子程序写的不是很完善,直接导致后面的课程设计一失败,问题总是出在自已应该push的时候没有push好了不说了看代码
assume cs:code,ds:data
data segment   
    db 16 dup(0)
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'   
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'   
    db '1993','1994','1995' 
data ends
code segment
        start:mov ax,data
                        mov ds,ax
                        mov ss,ax
                        inc ax
                        mov es,ax
                        mov ax,0
                        mov sp,ax
                        call show_str1
                        mov ax,4c00h
                        int 21h
show_str1: push ax
                         push bx
                         push cx
                         push dx
                         mov dx,0208h
                         mov ax,0
                         mov bx,0
                         mov cx,21
           d:  mov ax,es:[bx]
                         push ax
                         mov ax,es:[bx+2]
                         push ax
                         pop ds:[2]
                         pop ds:[0]
                         push cx
                         mov cx,02h
                         call show_str
                         pop cx
                         inc dh
                         add bx,4
                         loop d
                         pop dx
                         pop cx
                         pop bx
                         pop ax
                ret
show_str:     push di 
                  push si
                           push dx
                  push bx  
                  push es                  ;注意ss:sp指向长度
                  dec dh                   ;送入变量dh行号,dl为排号注意寄存器的使用cl为颜色 
                   dec dl    
                   mov ax,0 
                   mov al,dh    
                   mov bx,0    
                    mov bl,10    
                    mul bl 
                    mov bx,ax 
                    mov ax,0b800h 
                    add ax,bx 
                    mov es,ax 
                    mov ax,0 
                    mov  al,dl    
                    add al,dl    
                    mov bx,ax    
                    mov di,0    
                    mov  ch,cl     
       ok:        mov cl,[si]    
                    push cx    
                    mov ch,0    
                    jcxz return    
                    pop cx   
                    mov es:[bx+di],cx   
                    add di,2    
                    inc si    
                    jmp short ok    
       return:   pop cx 
                    pop es 
                    pop bx
                                pop dx
                    pop si 
                    pop di 
                    ret 
code ends 
         end start
code ends
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved