注册 登录
编程论坛 汇编论坛

求助,很短的程序,但是很奇怪的结果

lxy199403017 发布于 2014-10-20 17:50, 3598 次点击
assume cs:code
code segment
s:  mov ax,bx ;2字节
    mov si,offset s
    mov di,offset s0 ;为何此处可以用s0,s0不是在后面么?编译不应该是顺行的么?为何c和c++都是顺序执行的呢
                     ;那么为何汇编能在还没有s0的时候就使用s0呢???
    mov ax,cs:[si]
    mov cs:[di],ax ;将s处的语句复制到s0处,debug后成功,但是却不执行s0处语句,为何??


s0: nop
    nop

    mov ax,4c00h
    int 21h

code ends
end s
;工具:DOSBox
;编译工具:masm5
;调试工具:debug32 /debug
4 回复
#2
龙牙2014-10-20 20:03
mov di,offset s0只是将偏移地址送给DI,
assume cs:code
code segment这两句应该调换位置

[ 本帖最后由 龙牙 于 2014-10-20 20:05 编辑 ]
#3
lxy1994030172014-10-22 00:26
回复 2 楼 龙牙
是的,但是s0处语句不执行,将s0偏移地址存入di后,将mov cs:[di],ax,ax里存放的是s地址的内容,即mov ax,bx 的机器码,但是程序执行到s0后却不执行mov ax,bx.
#4
hu9jj2014-10-22 07:36
第一个问题:
汇编程序的编译过程至少要进行两次,第一次编译时会计算出所有标号对应的实际地址,也就是标号地址对照表,第二次编译时将实际地址替换到标号气所处的位置。所以程序可以随意调用标号,而不必考虑标号所处的位置。
#5
tlliqi2014-10-22 07:55
不懂
1