. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->《IBM-PC汇编语言程序设计》支持区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  这个宏调用为什么出错?  [已解决] 回复[ 6次 ]   点击[ 884次 ]  
wfygowxf
[帖 主]   [ 发表时间:2008-02-19 18:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-11-16 22:54
;*************************
;用宏指令定义一个可显示字符串:‘good students:classx name',其中X和NAME在宏调用时给出
disp_good        macro    x,name
        good    db  'good student:class&x &name',0ah,0dh,'$'
        endm
;*************************
code    segment
    
;----------------------------
main    proc    far
    assume    cs:code
start:    
    disp_good 2,jack        ;宏调用

    mov    ax,code
    mov    ds,ax        ;ds point to code segment

    lea    dx,good        偏移地址放入DX中
    mov    ah,09h        调用DOS 09中断显示字符串
    int    21h

    mov    ax,4c00h
    int    21h
    
main    endp
;-----------------------------
code    ends
;************************
    end    start
   谢谢各位指教下,用DEBUG调试时会出错,请问为什么?
mouse
[第1楼]   [ 回复时间:2008-02-22 10:17 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
好久没有看IBM上的程序了,还有这个宏指令,调了半天才出来:-)  

首先我把格式调了调,macro name 和endm是一对伪指令,它们应该是对其的才对,其他的也一样。(还有就是我觉得把assume放到最上面比较顺眼,也符合逻辑)  
下来就是解决上面程序中错误的地方了。  
   我在宏定义的地方加了一个跳转指令:  
    jmp short jmp_macro_data  
   disp_good 2,jack        ;宏调用   
jmp_macro_data:  
   ...  

原因是汇编程序被汇编时,汇编程序将对每个宏定义调用做宏展开。而楼主的宏定义的是数据,显然是不能当作指令来执行的,所以用jmp指令条多这些定义的数据。(这个和王爽老师书上讲增加“start 和 end start”的原因一样)。  


以下是代码:  

;用宏指令定义一个可显示字符串:‘good students:classx name',其中X和NAME在宏调用时给出    

assume cs:code  

disp_good macro  x,name      
     good db  'good student:class&x &name',0ah,0dh,'$'    
endm   

code segment    
start:        

    jmp short jmp_macro_data  
    disp_good 2,jack        ;宏调用   
jmp_macro_data:  

    mov ax,code    
    mov ds,ax        ;ds point to code segment    

    lea dx,good      ;偏移地址放入DX中    
    mov ah,09h       ;调用DOS 09中断显示字符串    
    int 21h    

    mov ax,4c00h    
    int 21h        
code    ends    
end    start   

运行结果:  

C:\masm>macro  
good student:class2 jack  

C:\masm> 

想开了之后原因很简单,由于宏汇编的设计是:当汇编程序编译时,将展开每个宏。而楼主定义的宏是数据,展开后cpu把数据当作指令执行而发生错误。
mouse
[第2楼]   [ 回复时间:2008-02-25 10:01 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
这样的方法更到,我也是刚学到的o(∩_∩)o...

disp_good macro  x,name  
  jmp short dis_re 
     good db  'good student:class&x &name',0ah,0dh,'$'      
  dis_re: 
endm
younggay
[第3楼]   [ 回复时间:2008-02-25 10:19 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
mouse说的很对。我们要保证我们定义的数据不能让cs,ip给指向了,否则,数据就当作指令来运行了,如此,后果可能就很莫名其妙了。
lijangwei
[第4楼]   [ 回复时间:2008-02-25 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:9
注册日期:2007-11-01 20:06
d 在下受教了,谢谢
wfygowxf
[第5楼]   [ 回复时间:2008-02-25 19:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-11-16 22:54
谢了!我学傻了!
wfygowxf
[第6楼]   [ 回复时间:2008-02-25 19:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-11-16 22:54
此贴由 贴主 于 [ 2008-02-25 19:57 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved