‘壹’ vs反汇编函数入口处指令
这个很简单ebp-0c0h是给出一段深度为0c0h堆栈,留给你的函数存变量。
因为第一条指令前还有一条指令mov ebp esp所以从ebp到esp是一个深度为0c0h的堆栈,可以想想下esp想当于地面
现在你朝地下挖了个深度为0c0h的洞,ebp现在就是洞底。
然后,rep stos是重复指令,重复次数是 30h 次,表示每次都向那个洞里放0cccccccch,
0ccccccch是4个字节,放30次,刚好等于第一句指定的堆栈的深度(16进制 30h*4=0c0h,有不理解打开windows
计算器算下)
所以余下三句的意思就是你把那个洞里全放成了0cccc cccch
为什么要放0ccccccch?
0cccccccch是个机器指令,是个中断指令。因为堆栈是存变量的,不可能被执行,所以一旦万一发生错误使堆栈被执行,那也只能执行个中断
被断了下来。
《天书夜读从汇编到windows内核编程》第一章有详细说明,有什么不理解你再去参考下吧
‘贰’ 汇编 radasm win32程序 怎么指定程序入口地址
前些天,看到这个标题,直接过了,因为这个好像根本不是问题,结果过了几天,看这个问题还没有结果,于是好奇,进来看看。
RadASM只是一个开发环境,具体使用什么语言,你要有那个语言的编译和链接器,放在任何目录都可以,然后在对应那个语言的xxxx.ini中指定编译器和连接器的位置,如果是MASM宏汇编,那么需要在MASM.INI中指定,例如:
[Enviroment]
1=path,c:masm32in;
[CharTab]
2=0251222522222232;20-2F
3=1111111111242221;30-3F
[Open]
0="汇编源文件 (*.asm;*.inc;*.mac;*.txt),*.asm;*.inc;*.mac;*.txt"
1="资源文件 (*.rc),*.rc"
2="文本文件 (*.txt),*.txt"
3="所有文件 (*.*),*.*"
src="汇编文件 (*.asm),*.asm,asm"
hdr="头文件 (*.inc),*.inc,inc"
mod="模块 (*.asm;*.mac),*.asm;*.mac"
1=path 这个就是用来定义宏汇编编译器的地址,填上正确的地址即可。
至于汇编源程序,你完全可以如在DOS环境下使用的那样,例如:
.data
s1 db '这里放数据‘,0
.code
entry proc
mov eax, [eax].PEB.ImageBaseAddress
call GetCurrAddr
mov hInstance[ebx], eax
......
entry endp
.data
s2 db '这里也放数据,当然也可以放到前面去。
.code
start:
mov dest, offset Mz
mov clenth, Len
invoke GetCurrentDirectory,nBufLen, addr szFName
invoke lstrcat,addr szFName, addr myFName
invoke CreateFile,addr szFName, ; pointer to name of the file
GENERIC_WRITE or GENERIC_READ,; access (read-write) mode
null, ; share mode
null, ; pointer to security attributes
CREATE_ALWAYS, ; how to create
FILE_ATTRIBUTE_NORMAL, ; file attributes
NULL
mov hFile, eax
invoke WriteFile,hFile,dest,clenth,addr br,NULL
.if eax
invoke lstrcpy,addr szFName,addr myFName1
invoke lstrcat,addr szFName,addr szOpenOk
invoke MessageBox,null,addr szFName,
addr szCaption,MB_OK
.else
invoke MessageBox,NULL,addr szOpenEr,
addr szCaption,MB_ICONERROR or MB_OK
.endif
invoke CloseHandle,hFile
xor eax, eax
invoke ExitProcess,eax
end start
编译链接后,代码从 start开始执行,start 的级别比 entry 高,如果代码中有entry,同时有start,那么编译后,结果是start,而不是entry,准确的说法是结尾 end 后面根的启动地址名称,随便叫什么都可以,习惯上用 start。
这是我以前写书时写的一些演示代码,都是在RadASM中开发的,代码绝对都可以编译运行的,我在附件里给你发一个汇编源代码,你可以试着用RadASM来编译一下。
‘叁’ 汇编语言用于指示程序开始的地址的伪指令是
有两种方式指定程序开始执行的地址:
END伪指令。
格式为END <程序入口标号>
.STARTUP伪指令。(注意前面有个点)
程序将从此处开始执行,无需在END伪指令中指定。
‘肆’ 汇编 dw 在程序 入口前面,是不是说dw 命令就不执行 程序入口到底是什么意思
汇编语言中,DW 是伪指令,它在作用是:往存储器中存放数据。
比如,LED汉字显示屏,显示汉字的大量点阵数据,就可以用 DW 来存放。
这样的点阵数据,是不应该当做程序来执行的,程序的入口,就不应该是 DW 所在的地方。
但是,也有高手,用 DW 指令,向存储器中,存放指令的机器码。
这样的机器码,是可以当做程序来执行的,程序的入口,就可以是 DW 所在的地方。
‘伍’ 如何说明汇编程序的入口
汇编语言的注释是每行从分号“;”开始的,分号之后的内容都属于注释。一般而言,汇编语言的注释在以下几个地方:
1、程序的最前面,注释内容一般说明该程序总的说明,解释程序的主要功能,程序的版本号,程序的修改日志,程序的编制人等等
2、子程序的前面,一般说明该子程序或函数完成的功能,输入参数,输出参数,影响的标志位等等。
3、指令行的后面,注释该行语句的功能。
比如以下简单程序的注释。
;--------------------------------------
;该程序完成一个LED灯的闪烁
;编制时间:XXXXX
;完成人:XXXX
;--------------------------------------
ORG 0000H
LJMP MAIN:
ORG 0030H
MAIN:
CLR P1.0 ;led置低
LCALL DELAY ;延时
SETB P1.0 ;LED置高
LCALL DELAY ;延时
SJMP MAIN ;转MAIN循环
;------------------------------
;延时子程序
;输入参数:无
;输入参数:无
;------------------------------
DELAY:
MOV R2,#200
D1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,D1
RET
END
‘陆’ 汇编语言指令大全,要详细的 !!!!
一、数据位传送指令:
1、MOV C, bit ;bit 可直接寻址位 C←(bit)
2、MOV bit,C ;C 进位位 (bit) ← C
二、位变量修改指令:
1、CLR C ; 将C=0
2、CLR bit
3、CPL C ; 将C求反再存入C
4、CPL bit ; 将bit求反再存入bit
5、SETB C ; 将C=1
6、SETB bit ; (bit) ← 1
三、位变量逻辑指令:
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
‘柒’ 汇编语言 ENTRY 是什么指令
在ARM汇编中,ENTRY 是一个伪指令,用于指定汇编程序的入口点。在一个较大型的完整的汇编程序(多个源文件组成的工程)中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在某一个源文件里最多只能有一个ENTRY(可以没有)。
‘捌’ 51单片机汇编程序入口后加的跳转指令"LJMP"是因为什么 如:ORG 0 LJMP STAR ORG 0003H LJMP INT0S
要弄明白这个问题,你要对51单片机的中断有一个初步的了解,我可以给你介绍一下。
比方说你希望不管程序运行到哪里,只要你一按某个按键,就执行一段你预先写好的程序,然后再回到原来的地方继续。你按按键的动作可以视为单片机的一个I/O管脚电平由高到低(如果你把按键接在I/O和地之间)。在51单片机中,有两个I/O可以实现这样的功能(这就是外中断,ORG
0003H
LJMP
INT0S
中的INT0S就是外中断0,具体你可以查51单片机中断系统的资料)。
那它到底是怎样实现的呢?比方说,某一时刻,你的按键按下了,处理器会知道满足了外中断的触发条件,那它会执行哪一段程序呢?设计师人为地给它规定了一个固定的地址,如外中断0被触发时就是跳到地址为0003H的单元开始执行,别的中断(定时器等)同理,都有一个固定的地址,一旦被触发就会自动跳到那个地址,这就是中断向量。
那为什么是0003H而不是程序存储器的末尾呢?这是因为不同51单片机的存储器大小是不同的,如果中断向量也因此而不同的话,单片机开发的麻烦就太多了。所以设计师干脆就把中断向量放在开头。单片机复位后是从0000H开始执行的,总不能让它一开始就无缘无故中断,所以要转移到一个和中断向量不相干的地方执行主程序。ORG
0
LJMP
STAR(其实应该是START)就是这样一个转移指令,转到标记为START的主程序处开始执行。一条LJMP指令的长度为3,这也就是第一个中断向量为0003H的原因了(不浪费一丝空间,不得不佩服Intel设计师的高明)。
ORG
0003H
LJMP
INT0S
为什么中断向量处还要跳转呢?这是因为中断向量间的空间也很有限,只能完成一些最简单的任务,稍微长一点的程序就需要放在更大的空间里,从中断向量处跳转到该处执行真正的中断服务程序。
有关中断系统的具体内容,建议你还是看看相关资料,我只是把它的基本原理和你讲了一下,真正使用还是请你自己探索。
‘玖’ jne的汇编指令是什么
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
jne是汇编指令中的一个条件转移指令。当ZF=0,转至标号处执行。