HB无影 发表于 2014-2-11 10:13:19

王爽汇编实验五(4)答案不解!

本帖最后由 HB无影 于 2014-2-11 10:13 编辑

实验5(1)0assume cs:code,ds:data,ss:stack                              data segment       dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment       dw 0,0,0,0,0,0,0,0 stack ends code segment start:mov ax,stack       mov ss,ax       mov sp,16       mov ax,data       mov ds,ax       push ds:       push ds:       pop ds:       pop ds:       mov ax,4c00h       int 21h code ends end 实验5(3)assume cs:code,ds:data,ss:stack code segment start:mov ax,stack       mov ss,ax       mov sp,16       mov ax,data       mov ds,ax       push ds:       push ds:       pop ds:       pop ds:       mov ax,4c00h       int 21h code ends data segment       dw 0123h,0456hdata ends stack segment       dw 0,0stack ends
end不指明程序入口,用masm5.0调试依然通过(附下图),可网上很多答案都说(1)不可以正确执行,(3)可以正确执行是什么意思啊,包括甲鱼答案也是(附下图)实验5(1)cmd窗口:实验5(3)cmd窗口:








无念道长 发表于 2014-2-11 10:48:38

对于你的问题,我手上暂时没有工具尝试调试,暂时给你简单的说一下吧。
程序开始的时候,如果end 后面没有标号,就直接从加载的地方(程序正文第一行,也就是assume的下一行)开始执行,之所以大家都说(3)可以执行,是因为(3)的assume下面第一句就是代码段的开始,正好是你想让程序执行的第一句,而且后面你也设置了ss和ds,所以可以正常执行,而(1) end 后面没有标号,说明程序会从data segment开始执行,所以应该是执行的结果和你预想的不一样的。
但是具体5.0是不是做了更改,在程序预编译前,把伪指令assume关联的寄存器,先做重定位,先定位到CS所指的位置,我就不太清楚了,如果是那样的话,程序应该也可以正常执行,所有程序将在CS关联的地址开始执行,这个楼主自己可以写程序测试一下。
单位好多编程和Hacker软件不让用,等我回家测试一下,再回复你吧。。。。

tk2003 发表于 2014-2-11 11:59:45

2L解释的到位!
第3个的代码,第一条就是指令,所以它肯定是能执行啦,即使没有用end指出程序退出
第1个和第2个,第一条不是指令,是数据段,存放的是数据,就不执行啦

jiangyuming0434 发表于 2014-2-11 12:02:11

我也学习了,这里的人真好

无念道长 发表于 2014-2-11 13:36:01

本帖最后由 无念道长 于 2014-2-11 13:37 编辑

我回家帮你测试了,(1)程序在执行时,第一条语句16进制码是"2301"(存储时先存低八位,再存高八位,所以顺序是反着的),翻译成汇编语言是“AND AX,”,是不对的,我家用的就是masm5.0,所以解释就如上次我回复的

HB无影 发表于 2014-2-11 18:35:39

无念道长 发表于 2014-2-11 13:36 static/image/common/back.gif
我回家帮你测试了,(1)程序在执行时,第一条语句16进制码是"2301"(存储时先存低八位,再存高八位,所以顺序 ...

懂了,他们说的3能正确执行那个意思懂了,你说的很详细也很ok
谢!
页: [1]
查看完整版本: 王爽汇编实验五(4)答案不解!