汇编学习笔记五

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。

猜你喜欢

转载自www.cnblogs.com/pppyyyzzz/p/12037369.html