导航:首页 > 净水问答 > 汇编pushedi

汇编pushedi

发布时间:2022-05-06 14:08:09

㈠ 求汇编指令解释dec edx

add byte ptr ds:[eax],al ;将AL寄存器中的内容存入段寄存器DS定位的,由EAX寄存器指向的内存单元.
push edi ;将EDI寄存器压入堆栈,注意是四个字节
push ds ;将DS寄存器压入堆栈,注意是两个字节
dec edx ;让EDX寄存器自减一,即 EDX <- (EDX)-1

㈡ 反汇编小白求知:push esi push edi push 9 push r10 pop edi 然后。。。。。会怎样

push esi //esi进栈
push edi //edi进栈
push 9 //9进栈
push 10 //10进栈
pop edi //10出栈保存到edi中

//栈中的数据变成了
9
edi
esi

----------没啥意思的。没事到0x30网络贴吧耍耍, 一起讨论分享交流编程技术。

㈢ 汇编语言函数调用的疑惑

;这段代码的作用是对局部变量的支持
00401020 55 push ebp ;保存堆栈指针
00401021 8B EC mov ebp,esp ;把esp的值赋给ebp
00401023 83 EC 40 sub esp,40h ;为局部变量留出空间
;保存重要的寄存器
00401026 53 push ebx
00401027 56 push esi
00401028 57 push edi
;处理代码
00401029 8D 7D C0 lea edi,[ebp-40h]
0040102C B9 10 00 00 00 mov ecx,10h
00401031 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401036 F3 AB rep stos dword ptr [edi]
函数中“}”所对应的代码如下:
;恢复关键的寄存器
00401047 5F pop edi
00401048 5E pop esi
00401049 5B pop ebx
;平衡堆栈
0040104A 8B E5 mov esp,ebp
0040104C 5D pop ebp
;返回
0040104D C3 ret

;你是说堆栈的情况吗?
;应该是:(栈顶在上面,在所有压栈操作后)

;EDI 堆栈顶
;ESI
;EBX
;局部变量区(40H大小)

;EBP
;CALL压入的返回地址
;如果有参数就应该在这里

;出栈操作你自己就就知道啦,后面的指令怎么样恢复ESP和平衡堆栈的!

㈣ 求一段汇编的解释

push eax ;入栈
push edi ;入栈
push ecx ;入栈,这里的三句是为了保护寄存器的数据

mov al, byte ptr[esp + 0x8 + 0xC] ;取一个字节的数据到AL
mov edi, dword ptr[esp + 0x4 + 0xC] ;取一个BUFFER的地址
mov ecx, dword ptr[esp + 0xC + 0xC] ;取这个BUFFER的大小
rep stosb ;循环给BUFFER赋值,将AL赋给整个BUFFER,循环次数为BUFFER大小.

pop ecx ;出栈
pop edi ;出栈
pop eax ;出栈,这里三句是为了恢复寄存器的数据
ret 0xC ;ret是从子程序返回,后面的值是要平衡栈,即ESP+0XC

--------------------------------------------------------------------------------
你这段代码既然是C里面嵌的,我猜想你外部的C代码大概结构如下

//我猜想C方法结构大概如下,实现的功能就是将BUFFER内存块全部实始化成指定的CHAR
void memsetChar(char *buffer,char c,int bufLen)
{
__asm{
这里是你求解释的汇编语言
}
}

下面再给个调用的例子:
char buffer[1024];
memsetChar(buffer,'A',1024); //将数组全部初始化成字符A

最后补充一句,那段汇编的功能等同于C函数 memset函数

㈤ 这道汇编程序 所要表达的意思 。

;这道汇编程序所要表达的意思是: 输入10个学生成绩(用空格隔开),分别统计及格(大于或等于60分)

;和不及格(小于60分)的人数,并按PASS: 和NO PASS: 格式显示。

;请逐条标明意思 特别是程序中的diplay子程序 一定要每条都写个大概意思
;
;
;
;用MASM5.0编译通过,以下是运行结果
;
;E:\masm1>PASS
;323 3 2 3 34 34 7 66 77 77
;PASS:4NO PASS:6
;E:\masm1>PASS
;100 99 99 99 99 99 99 98 97 87
;PASS:10NO PASS:0
;

DATA SEGMENT
ARRAY DW 10 DUP(0) ;定义10个成绩存放位置
A1 DB 0 ;及格人数
A2 DB 0 ;不及格人数
C1 DB 'PASS:$' ;显示及格信息
C2 DB 'NO PASS:$' ;显示不及格信息
;为了有更好的显示效果,上一行最好改成: C2 DB 0dh,0ah, 'NO PASS:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,10 ;输入10个成绩循环数
MOV BL,10
MOV SI,0
BEGIN: MOV DX,0 ;循环入口
Q1: MOV AH,1
INT 21H ;输入1位数
CMP AL,' ' ;是空格吗?
JZ Q2
PUSH AX ;不是空格,表示该数还未输完
MOV AX,DX
MUL BL ;将前面[已输入部分]*10 =>AX
MOV DX,AX
POP AX
SUB AL,30H
MOV AH,0
ADD DX,AX ;再加上现在输入的值
JMP Q1
Q2: MOV ARRAY[SI],DX ;是空格,保存该数
ADD SI,2 ;存数指针加2
LOOP BEGIN ;循环
MOV DL,0DH ;此以下6指令输出回车换行
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
LEA SI,ARRAY ;指向取成绩的首个数据
MOV CX,0AH ;取数循环次数
D1: MOV AX,[SI] ;循环入口(取成绩)
MOV BX,60
CMP AX,BX ;与60比较
JB S1 ;小于60转S1
INC A1 ;大于或等于60,计数器A1加1
JMP NEXT5
S1: INC A2 ;小于60,计数器A2加1
NEXT5: INC SI ;移动取成绩指针,因为是字,需+2
INC SI
LOOP D1 ;循环
NEXT6: LEA DX,C1 ;显示PASS:
MOV AH,9
INT 21H
MOV AL,A1
CALL DISPLAY ;调用显示子程序,显示A1中(及格人数)的数字
NEXT7: LEA DX,C2 ;显示NO PASS:
MOV AH,9
INT 21H
MOV AL,A2
CALL DISPLAY ;调用显示子程序,显示A2中(不及格人数)的数字
MOV AH,4CH ;程序结束
INT 21H
RET
;=====================
DISPLAY PROC NEAR ;显示子程序: 将AL中的值转换为ASCII码,并显示
CMP AL,10 ;因为总共只有10个成绩,所以最大值为10
JE BE10 ;等于10转BE10
MOV DL,AL ;<10
ADD DL,30H ;+30H转换成ASCII码
MOV AH,2
INT 21H ;显示
RET ;返回
BE10: ;是10
MOV AH,2
MOV DL,'1' ;显示'1'
INT 21H
MOV DL,'0'
INT 21H ;显示'0'
RET ;返回

DISPLAY ENDP
;========================

CODE ENDS
END START

㈥ 函数调用堆栈原理 push ebx push esi push edi是什么作用

[cpp] view plain
int goo(int a, int b)
{
return a + b;
}

void foo()
{
int a[] = {1, 2, 3};
int result = goo(a[1], a[2]);
printf("result: %d", result);
}

VS2010下编译

foo函数部分汇编:

[cpp] view plain
00EB3890 push ebp
00EB3891 mov ebp,esp
00EB3893 sub esp,0E4h
00EB3899 push ebx
00EB389A push esi
00EB389B push edi
00EB389C lea edi,[ebp-0E4h]
00EB38A2 mov ecx,39h
00EB38A7 mov eax,0CCCCCCCCh
00EB38AC rep stos dword ptr es:[edi]
00EB38AE mov eax,dword ptr [___security_cookie (0EB7000h)]
00EB38B3 xor eax,ebp
00EB38B5 mov dword ptr [ebp-4],eax
int a[] = {1, 2, 3};
00EB38B8 mov dword ptr [ebp-14h],1
00EB38BF mov dword ptr [ebp-10h],2
00EB38C6 mov dword ptr [ebp-0Ch],3
int result = goo(a[1], a[2]);
00EB38CD mov eax,dword ptr [ebp-0Ch]
00EB38D0 push eax
00EB38D1 mov ecx,dword ptr [ebp-10h]
00EB38D4 push ecx
00EB38D5 call goo (0EB11E5h)
00EB38DA add esp,8

goo函数完整汇编:

[cpp] view plain
00EB1580 push ebp
00EB1581 mov ebp,esp
00EB1583 sub esp,0C0h
00EB1589 push ebx
00EB158A push esi
00EB158B push edi
00EB158C lea edi,[ebp-0C0h]
00EB1592 mov ecx,30h
00EB1597 mov eax,0CCCCCCCCh
00EB159C rep stos dword ptr es:[edi]
return a + b;
00EB159E mov eax,dword ptr [a]
00EB15A1 add eax,dword ptr [b]
}
00EB15A4 pop edi
00EB15A5 pop esi
00EB15A6 pop ebx
00EB15A7 mov esp,ebp
00EB15A9 pop ebp
00EB15AA ret

foo函数push ebp, mov ebp, esp后
保存原ebp,设定新的ebp为当前esp位置

sub esp, 0E4h
给局部变量分配足够大的栈空间

保存原先的一些寄存器值,每次push,esp继续向下移

为局部变量a数组赋值

调用goo前Push两个参数,esp继续下移

call goo函数时,cpu自动push下一条指令地址,esp继续下移

在goo函数中,同样保存foo函数中的ebp值,设定新的ebp,esp等

在执行玩goo函数最后几句指令时,edi, esi, ebx恢复,esp同时也编程goo中ebp的位置,ebp恢复至foo函数原来的位置(pop ebp)
下一条指令也装入IP(ret指令),esp继续向上一步

foo函数中的add esp, 8将esp值继续往上(清除函数参数)
清除函数参数的工作也可通过ret X在goo函数返回时设定(这样的话不必在每次调用点上加上add esp, X指令缩短了编译出来的文件大小,但在子函数中清除将不能做到printf等的可变参数个数功能,因为子函数不知道具体有多少要参数进入了,只有调用处才知道)

㈦ 一个简单的问题 c语言调用汇编代码再调用Messagebox函数,求代码分析

内嵌汇编可以直call函数名调用函数,根本不用这么折腾。另外其实他获得函数入口的的方法是错的,知识碰巧能用而已。

lea edx, [ebp - 04h] 就相当于edx = ebp - 04h汇编写就是
mov edx, ebp
sub edx, 04h
但是前一种写法方便,执行效率也高。

三个push是把MessageBox的参数推进栈。类似于C里写MessageBox(edi, edx, edx, edi)(因为前面还有一个push edi)。因为edi是0,edx是那个Hi,所以其实就是MessageBox(0, "Hi!", "Hi!", 0)。

㈧ 使数据段、附加段与代码段同段的作用是什么呀

程序不好破解,还有程序中的数据保密性较强。。。一般病毒、黑客和加密程序才这么做吧。。。常规程序好像没有这么写的。。。
而且这种做法只能用汇编来完成,其他高级语言都会分段。
给你举个例子。。。
在C语言中:
char *p = "123";
printf(p);
这两行代码经过编译后,"123"这个数据就会被放置于数据段中,而printf(p)则存在于代码段。程序执行后会在控制台输出"123"。

char p[10];
strcpy(p, "123");
printf(p);
这三行代码经过编译后,p[10]会在内存中开辟空间并将地址放置于数据段中,"123"也将存在于数据段中,strcpy和printf将存在于代码段中。程序执行后会在控制台输出"123"。

在汇编语言中:
.....
mov edi, $ ;这行代码的意思就是将EIP寄存器的内容写入EDI,$代表当前指令的EIP
nop
nop
nop
nop
mov ptr byte [edi], '1'
mov ptr byte [edi+1], '2'
mov ptr byte [edi+3], '3'
mov ptr byte [edi+4], 0
push edi
call ....
...
这几行汇编中存在常量"123",程序运行后在控制台输出"123",但是却没有数据段。当程序执行完一大堆的nop之后,接下去的指令将常量"123"动态的写入从"mov edi, $"指令开始的3个字节的空间,并将原指令替换掉了,所以其常量存在于代码段。

.....
mov edi, $
nop
nop
nop
nop
...
...
push edi
call ....
...
这几行汇编代码中,当程序执行到push edi之前的指令时,相当于在代码段中开辟了N个字节的空间(N = 多少个nop + "mov edi, $“的长度),通过向[edi]中写入数据,即相当于strcpy。而这N个字节的数据储存空间也存在于代码段。

由上面的不难看出,如果数据段要和代码段合并,则必须通过指令动态的在代码段中分配相应的储存空间,分配后写入数据,便会将源指令替换掉。换句话说,这种代码只能执行一次,若第二次执行,操作系统就会发出CPU遇到无效指令的错误。
当然,你也可以把空间分配到永远不可能执行到的指令处,比如:
...
jmp xxxx
_MemoryStart:
mov edi, $
jmp _EntryContinue
nop
nop
nop
...
nop
_MemoryEnd:
...
这样一来,你只需要在程序启动时,使用指令jmp _MemoryStart来分配空间,当程序返回到_EntryContinue的时候把edi的内容保存一下,那么你就可以永久使用[edi]中的空间了。因为在_MemoryStart之前有一个无条件跳转,所以无论在什么情况下代码执行到此处都会自动跳转到xxxx处,除非是用jmp指令直接跳转到_MemoryStart。。。。但是这样你要完全正确的搞定xxxx所指的地址。而且这个程序没有任何的兼容性可言,在WinXP SP1下能正常工作,但在SP2、SP3、Vista、Win7下就有可能无法工作了。

阅读全文

与汇编pushedi相关的资料

热点内容
液相用溶剂过滤器 浏览:674
纳滤水导电率 浏览:128
反渗透每小时2吨 浏览:162
做一个纯净水工厂需要多少钱 浏览:381
最终幻想4回忆技能有什么用 浏览:487
污水提升器采通 浏览:397
反渗透和不发渗透净水器有什么区别 浏览:757
提升泵的扬程 浏览:294
泽德提升泵合肥经销商 浏览:929
饮水机后盖漏水了怎么办 浏览:953
小型电动提升器 浏览:246
半透膜和细胞膜区别 浏览:187
废水拖把池 浏览:859
十四五期间城镇污水处理如何提质增效 浏览:915
怎么测试空气净化器的好坏 浏览:519
提升泵是干嘛的 浏览:744
布油做蒸馏起沫咋办 浏览:252
广州工业油烟净化器一般多少钱 浏览:204
喜哆哆空气净化器效果怎么样 浏览:424
油烟净化器油盒在什么位置 浏览:582