基本格式
汇编语言基本格式:
include irvine32.inc
.data
.code
main proc
main endp
end main
基础指令
乘法imul eax,ebx
除法div eax,ebx
加法add eax,ebx
减法sub eax,ebx
自减dec num
自增inc num
乘2[左移一位] shl eax,1
除2[右移一位] shr eax,1
有符号数中:
cmp 比较大小
jz
jmp 无条件跳转
jl 小于跳转
jle 小于等于跳转
jg 大于跳转
jge 大于等于跳转
je 等于跳转
无符号数中:
ja 大于跳转
jae 大于等于跳转
jb 小于跳转
jbe 小于等于跳转
je 等于跳转
jna 不大于跳转
jne 不等于跳转
jnb 不小于跳转
函数
函数特点:
1.不能进行传参
2.无返回参数
函数格式:
函数名 proc
....
ret
函数名 endp
;调用函数
call 函数名
参数的传递需使用寄存器传参方式,即不建议在命令中写入数字参数。
举例:乘法应写为imul eax,edx,而不是imul eax,6
用函数求1+2+…+N
C语言描述:
#include <stdio.h>
int sum(int n)
{
int result=0;
for(int i=1;i<=n;i++)
{
result+=i;
}
return result;
}
int main()
{
int n=10;
int result1=sum(n);
printf("%d",result1);
}
汇编语言:
include irvine32.inc
.data
n dword 10
sum dword ?
.code
; 求1+2+3+...+N
cacul proc
xor eax, eax ; 清空累加器
mov ecx, n
mov ebx, 1 ; 将循环计数器放入 ebx
sumloop:
add eax, ebx
inc ebx
loop sumloop
mov sum, eax
ret
cacul endp
main proc
call cacul ; 调用 cacul 过程
mov eax, sum ; 将结果放入 eax
call writeint ; 输出结果
ret
main endp
end main
运行结果:

OllyDBG
test.asm文件经编译后得到test.exe文件,使用OllyDBG打开test.exe文件即可进行观察及调试。本文简单介绍观察操作。
页面窗口如下:

在反汇编窗口中,可以执行多种操作,操作生效时,对应的寄存器窗口、信息窗口、数据窗口、堆栈窗口都会发生改变。
在反汇编窗口中,常用的操作如下:
1、F7:用于执行一句OP code,若遇到CALL,进入函数代码内部。
2、F8:用于执行一句OP code,若遇到CALL,仅执行函数自身,不跟随进入。
3、F9:运行(遇到断点时暂停)
如果执行的操作涉及到寄存器值的改变,则会在寄存器窗口中显示出来:

如果执行的操作涉及到数据段中数据的改变,则会在数据窗口中显示出来:

那么怎么判断数据窗口中改变的数据对应的是哪个参数呢?
以如下的test.asm文件为例:
include irvine32.inc
.data
numbers dword 11,33,73,52,93,84,67,56,64,75
count60 dword 0
count dword 10 ;对比10次
.code
main proc
mov esi,offset numbers
func:
cmp count,0
jz output
mov ebx,[esi]
cmp ebx,60
jge countadd ;大于等于60,则跳转
dec count
add esi,4
jmp func
countadd:
inc count60 ;数量加一
dec count
add esi,4
jmp func
output:
mov eax,count60
call writeint
mov ebx,eax
mov eax,10
sub eax,ebx
call writeint
main endp
end main
该文件实现了在数组中对大于60的数的个数的计算,最终count60为6,count为0。
其中共有12个已定义的数据,且它们以双字的形式存在:
numbers dword 11,33,73,52,93,84,67,56,64,75
count60 dword 0
count dword 10
而十进制在数据段中是以16进制存在的,十进制的10即为十六进制的0B,所以它们在数据窗口的形式如下图所示:

每执行完一次对比,count将减一,故程序结束时count为0
每执行完一次对比,如果这个数大于等于60,则count60自增1,故程序结束时count60为6
程序正常结束时,代码中的输出语句也被执行,数据回显在窗口:
output:
mov eax,count60
call writeint
mov ebx,eax
mov eax,10
sub eax,ebx
call writeint

本文详细介绍了汇编语言的基本格式、指令集,包括乘法、除法、加法等操作,以及函数的使用和特点。同时,通过实例展示了如何在OllyDBG中观察和调试代码,涉及数据窗口的使用和参数传递方法。
1万+





