分类: C/C++
2008-03-20 10:10:22
4.4 深度思考 4.4.1 是不是数据必须放数据段,代码必段放代码段呢? 答,代码必段放代码段,否则你怎么执行呀?但数据也可以放到代码段,只是程序要作修改。 code SEGMENT ASSUME CS:code msg DB 'Hello, Mr.286.$' start:MOV AX,code MOV DS,AX lea dx,msg mov ah,9h int 21h MOV AX,4C00h INT 21h code ENDS END start 编译后仍然可以。 4.4.2 我编的程序在内存中是什么样子的呢? ------------------------------------------------------------------------ E:\Download\Masm>debug hello286.exe -u 1420:0000 B81F14 MOV AX,141F 1420:0003 8ED8 MOV DS,AX 1420:0005 8D160000 LEA DX,[0000] 1420:0009 B409 MOV AH,09 1420:000B CD21 INT 21 1420:000D B8004C MOV AX,4C00 1420:0010 CD21 INT 21 1420:0012 FF362421 PUSH [2124] 1420:0016 E87763 CALL 6390 1420:0019 83C406 ADD SP,+06 1420:001C FF362421 PUSH [2124] -d 141f:0000 L20 141F:0000 48 65 6C 6C 6F 2C 20 4D-72 2E 32 38 36 2E 24 00 Hello, Mr.286.$. 141F:0010 B8 1F 14 8E D8 8D 16 00-00 B4 09 CD 21 B8 00 4C ............!..L -q E:\Download\Masm> ------------------------------------------------------------------------------ 上面是什么呀?,还记得前面说的吗? 1420:0000 B81F14 MOV AX,141F | | | | | 段址:偏址 机器语言 mov指令 把段地址的地址(141f)赋值给AX寄存器。 1420:0012后面的是垃圾数据,不用管它,把上面程序与源程序作一个比较,看有什么不用,差别在于把标号语言转成实际地址了。 程序前两行一执行,数据段地址就变成了141f,而那个字符串偏移地址在0000,由(LEA DX,[0000]看出),所以我用-d 141f:0000 L20(后面L20表示只显示20个字节),就能把段地址显示出来了。 所以刚才的程序在内存中就变成了: 141f:0000 Hello, Mr.286.$ ----->这是段地址里的内存 1420:0000 B81F14 MOV AX,141F ------>这是代码段里的内存。data变成了实际地址 1420:0003 8ED8 MOV DS,AX 1420:0005 8D160000 LEA DX,[0000] ------>偏址变成了0000,因为实际上msg也就是从头开始的。当然是0了。 1420:0009 B409 MOV AH,09 ------->注意Debug里,默认的是十六进制 1420:000B CD21 INT 21 1420:000D B8004C MOV AX,4C00 1420:0010 CD21 INT 21 |