王爽汇编实验五(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窗口:
对于你的问题,我手上暂时没有工具尝试调试,暂时给你简单的说一下吧。
程序开始的时候,如果end 后面没有标号,就直接从加载的地方(程序正文第一行,也就是assume的下一行)开始执行,之所以大家都说(3)可以执行,是因为(3)的assume下面第一句就是代码段的开始,正好是你想让程序执行的第一句,而且后面你也设置了ss和ds,所以可以正常执行,而(1) end 后面没有标号,说明程序会从data segment开始执行,所以应该是执行的结果和你预想的不一样的。
但是具体5.0是不是做了更改,在程序预编译前,把伪指令assume关联的寄存器,先做重定位,先定位到CS所指的位置,我就不太清楚了,如果是那样的话,程序应该也可以正常执行,所有程序将在CS关联的地址开始执行,这个楼主自己可以写程序测试一下。
单位好多编程和Hacker软件不让用,等我回家测试一下,再回复你吧。。。。 2L解释的到位!
第3个的代码,第一条就是指令,所以它肯定是能执行啦,即使没有用end指出程序退出
第1个和第2个,第一条不是指令,是数据段,存放的是数据,就不执行啦 我也学习了,这里的人真好 本帖最后由 无念道长 于 2014-2-11 13:37 编辑
我回家帮你测试了,(1)程序在执行时,第一条语句16进制码是"2301"(存储时先存低八位,再存高八位,所以顺序是反着的),翻译成汇编语言是“AND AX,”,是不对的,我家用的就是masm5.0,所以解释就如上次我回复的 无念道长 发表于 2014-2-11 13:36 static/image/common/back.gif
我回家帮你测试了,(1)程序在执行时,第一条语句16进制码是"2301"(存储时先存低八位,再存高八位,所以顺序 ...
懂了,他们说的3能正确执行那个意思懂了,你说的很详细也很ok
谢!
页:
[1]