c++中嵌入的汇编代码unsigned long head=1__asm{pushad; mov eax,head; bsr ecx,eax; mov edx,dword ptr 31; sub edx,ecx; mov ecx,edx; mov eax,dword ptr 0x01; sal eax,cl; mov head,eax; popad;}这段代码的含义是什么
unsigned long head=1__asm{pushad; mov eax,head; bsr ecx,eax; mov edx,dword ptr 31; sub edx,ecx; mov ecx,edx; mov eax,dword ptr 0x01; sal eax,cl; mov head,eax; popad;}
汇编求解释
答案:2 悬赏:50 手机版
解决时间 2021-04-13 06:58
- 提问者网友:美人性情
- 2021-04-12 10:52
最佳答案
- 五星知识达人网友:封刀令
- 2021-04-12 11:08
unsigned long head=1;
__asm{
pushad; //将EAX ECX EDX EBX ESP(该指令执行之前的初始值) EBP ESI EDI分别入堆栈。
mov eax,head; //将head的值传送到eax寄存器中
bsr ecx,eax; //这个你要知道bsr指令是什么意思,扫描eax中第一位为1的位数,此时eax中为1所以执行后ecx中的值是15,因为eax是16位的寄存器;
mov edx,dword ptr 31;//?这个地方应该是[31]表示将地址31处的双字,也就是32位的数赋值给edx
sub edx,ecx; //edx中值减去ecx中值
mov ecx,edx; //将上述差值传送到ecx
mov eax,dword ptr 0x01; //将0x01处值,双字,也就是32位的一个数传送到eax中去
sal eax,cl; //将eax寄存器中的值左移,左移的位数由cl决定,即ecx寄存器低八位的数决定
mov head,eax; //将eax寄存器值传送到head变量中去
popad; //导出之前入堆栈的值
}
__asm{
pushad; //将EAX ECX EDX EBX ESP(该指令执行之前的初始值) EBP ESI EDI分别入堆栈。
mov eax,head; //将head的值传送到eax寄存器中
bsr ecx,eax; //这个你要知道bsr指令是什么意思,扫描eax中第一位为1的位数,此时eax中为1所以执行后ecx中的值是15,因为eax是16位的寄存器;
mov edx,dword ptr 31;//?这个地方应该是[31]表示将地址31处的双字,也就是32位的数赋值给edx
sub edx,ecx; //edx中值减去ecx中值
mov ecx,edx; //将上述差值传送到ecx
mov eax,dword ptr 0x01; //将0x01处值,双字,也就是32位的一个数传送到eax中去
sal eax,cl; //将eax寄存器中的值左移,左移的位数由cl决定,即ecx寄存器低八位的数决定
mov head,eax; //将eax寄存器值传送到head变量中去
popad; //导出之前入堆栈的值
}
全部回答
- 1楼网友:酒者煙囻
- 2021-04-12 11:35
data segment
hello db "hello world!", "$" ;必须要"$",表示显示结束,否则,就会一直显示到遇到$
data ends
code segment
assume cs: code, ds: data
start:
mov ax, data
mov ds, ax
lea dx, hello
mov ah, 09h
int 21h
mov ah, 4ch ;dos中断调用,使用ah做中断号
int 21h
code ends
end start
没用到pop, push之类的就不用堆栈
中断程序使用系统堆栈,这个不用管的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
正方形一边上任一点到这个正方形两条对角线的 |
阴历怎么看 ? |