【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用

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

基本格式

汇编语言基本格式:

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

在这里插入图片描述

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值