关于call和ret指令的本质,其实就是栈里保存的时候ip地址或者段地址和ip地址,然后利用压栈和出栈,区完成内存的跳转,我认为汇编无函数,就是内存的跳转和压栈出栈而
已。另外ss:sp 就是指向那个栈的栈顶指针,从上到下是由小到大,实质对应-d指令显示的机器内存从左到右是变大的,毕竟栈也是内存表示的这么一个抽象的东西。
每次执行call就会把下一条指令的ip压栈,ret的时候就会出栈并且赋给csip实现跳转。当然近转移和远转移一个道理,不过call far ptr是原转移,配合retf使用。
将数据写入代码段;栈段,数据段以及怎么把它们分开;dup指令可以获得一些重复的内存。数据段,栈段,代码段它们的内存是连续的,最少占据16个字节,并且只要代码段前面有写东西比如dw了一些数据,那么就得在它下面一行写start,最后end+个start,不然的话,-u指令看的话,它翻译的指令其实不是我们想要的结果,会混在一起导致无法翻译成功,有start后可以让cs和ip指向正确的开始的地方,尽管-u查看后机器码还是混在一起,但是有了start后代码段指针可以指向正确的位置所以说可以正常执行。
一个字相当于2个字节,1个字节相当于8个bit(一个二进制位就是一个bit),在MASM内部定义有几个数据类型比如
BYTE ,db,8位 WORD,dw,16位 DWORD,dd,32位(也就是int的大小) QWORD,dq,64位
十六进制不能以字母打头,在记事本里创建数据的时候,用0去填充
关于db,dw的基本用法手机照片截图了。
另外每个段地址之间差16个字节,比如1000:0000物理就是10000 1001:0000物理就是10010 差16进制的10也就是16个字节,一个段的大小就是16个字节。如果不写start那么他会让cs和ip指向开始的地方,但是因为前面以及有了栈段或者数据段或者其他的db什么东西,所以会得不到我们想要的东西,但是有了start那么它会让cs和ip指向代码段的正确的地方。