|
主题 : : 这个宏调用为什么出错? [已解决] |
回复[ 6次 ]
点击[ 884次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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调试时会出错,请问为什么? | | |
|
|
|
|
[第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把数据当作指令执行而发生错误。 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-02-25 10:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
mouse说的很对。我们要保证我们定义的数据不能让cs,ip给指向了,否则,数据就当作指令来运行了,如此,后果可能就很莫名其妙了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-02-25 15:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:7
信誉值:9
注册日期:2007-11-01 20:06 |
|
|
|
|
|
[第5楼]
[ 回复时间:2008-02-25 19:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-11-16 22:54 |
|
|
|
|
|
[第6楼]
[ 回复时间:2008-02-25 19:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-11-16 22:54 |
此贴由 贴主 于 [ 2008-02-25 19:57 ] 结贴。 结贴原因:问题已解决 | | |