assume cs:code code segment dw 0123h,0456h,0789h,0abch,0fedh,0cbah,0987h mov ax,0 mov bx,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end
在debug执行时,会发现报错,因为下一条执行指令并不是你要执行的指令,你的执行指令在别的地方。当你用-u查询时,会发现一些奇怪的命令,其实那些是你在用dw定义数据的时候的机器码,
所以总的来说,程序入口处不是我们希望的位置。所以可以把上述程序修改为下面的
assume cs:code code segment dw 0123h,0456h,0789h,0abch,0defh,0cbdh,0987h start: mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
加了start后,就通知了编译器程序的入口在什么地方。
程序来自于源程序中的汇编指令和定义的数据;描述信息则主要是编译、连接程序对源程序中相关伪指令进行处理所得到的信息。上述程序中,用伪指令end描述了程序的结束和程序的入口。在编译、连接后,由“end start”指明的程序入口,被转化为一个入口地址(从源程序返回到dos),存储在可执行文件的描述信息中。在上述源代码生成的可执行文件中,这个程序的入口位置的偏移地址为10H(dword一个占两字节)。当程序被加载入内存之后,加载者从程序的可执行文件的描述信息中读到程序的入口地址,设置CS:IP。