include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROC mov eax,80mov ebx,53call BitwiseMultiplycall WriteDecINVOKE ExitProcess,0
main ENDP;EAX=被乘数,EBX=乘数
BitwiseMultiply PROCmov edx,0mov ecx,32
L0:shl ebx,1jnc L1push ecxdec ecxpush eaxshl eax,cladd edx,eaxpop eaxpop ecx
L1:loop L0mov eax,edxret
BitwiseMultiply ENDPEND main
2:编写过程,实现任意两个大小(但两个数字节要一样长)的压缩十进制数加法
include Irvine32.inc.stack 4096
ExitProcess PROTO,dwExitCode:DWORDbyteSize =4.data
packed_1 BYTE 36h,45h,87h,99h
packed_2 BYTE 72h,07h,23h,45h
sum BYTE byteSize+1DUP(0).code
main PROCmov esi,OFFSET packed_1mov edi,OFFSET packed_2mov edx,OFFSET summov ecx,byteSizecall AddPackedINVOKE ExitProcess,0
main ENDP;ESI 第一个数的指针
;EDI 第二个数的指针
;EDX 和数指针
;ECX 相加的字节数
AddPacked PROCclc
L0:mov al,BYTE PTR[esi]adc al,BYTE PTR[edi]daamov BYTE PTR[edx],alinc esiinc ediinc edxloop L0mov al,0adc al,0mov BYTE PTR[edx],alret
AddPacked ENDP
END main
3:LEA : 伪指令LEA使用
.386.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDP;voidmakeArray();{;char myString[30];;for(int i =0;i<30;i++); myString[i]='*';;}
makeArray PROCpush ebpmov ebp,espsub esp,32;myString位于EBP-30的位置,因为会向4字节对齐lea esi,[ebp-30];加载myString的地址;mov esi,OFFSET[ebp -30] 报错,OFFSET只适用编译时已知地址mov ecx,30;循环计数器
L1:mov BYTE PTR[esi],'*';填充inc esi ;下一个元素loop L1 add esp,32;删除数组(恢复ESP)pop ebpret
makeArray ENDP
END main
4:ENTER_LEAVE : ENTER创建一个过程的堆栈帧,LEAVE结束一个过程的堆栈帧
.386.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCINVOKE ExitProcess,0
main ENDPMySub PROCenter 8,0;保留8个字节局部变量;等于;push ebp;mov ebp,esp;sub esp,8 leave;等于;mov esp,ebp;pop ebpret
MySub ENDP
END main
5:LOCAL : 为ENTER和LEAVE的高级版,可以定义局部变量类型与名字,跟在PROC后使用 LOCAL label:type ,…
.386.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.code
main PROCcall Example1INVOKE ExitProcess,0
main ENDPExample1 PROCLOCAL temp:DWORDmov eax,tempret
Example1 ENDP;生成汇编是下面这样,可以查看反汇编
;push ebp
;mov ebp,esp
;add esp,0FFFFFFFCh ;ESP加-4;mov eax,[ebp-4];leave
;ret
END main
6:递归函数,整数求和
include Irvine32.inc.code
main PROCmov ecx,5;计数值=5mov eax,0;存放和数call CalcSum;计算和数call WriteDeccall Crlfexit
main ENDPCalcSum PROCcmp ecx,0;检查计数值jz L2 ;若为零则退出add eax,ecx ;否则与和数相加dec ecx ;计数值递减call CalcSum;递归调用
L2: ret
CalcSum ENDP
END main
7:递归函数,阶乘
include Irvine32.inc.code
main PROCpush 5;计算5!call Factorial ;计算阶乘(EAX)call WriteDeccall Crlfexit
main ENDP;计算阶乘
;接收:[ebp+8]=n 需计算的数
;返回:eax =n 阶乘
Factorial PROCpush ebpmov ebp,espmov eax,[ebp+8];获取Ncmp eax,0ja L1mov eax,1jmp L2L1:dec eaxpush eaxcall Factorial
;每次递归调用返回时,都要执行下面的指令
ReturnFact:mov ebx,[ebp+8]mul ebx ;EDX:EAX = EAX*EBX
L2:pop ebp ;返回EAXret 4;清除堆栈
Factorial ENDP
END main
8:INVOKE_ADDR : 调用指令INVOKE 与 地址指令ADDR
.386.model flat,stdcall.stack
ExitProcess PROTO,dwExitCode:DWORD.data
Array DWORD 20DUP(?).code
main PROC;INVOKE Swap,ADDR Array,ADDR [Array+4];ADDR只能与INVOKE使用,也能是汇编常数;如果是使用stdcall,汇编器生成下面代码;push OFFSET Array+4;push OFFSET Array;call SwapINVOKE ExitProcess,0
main ENDPSwap PROCret
Swap ENDP
END main
从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是请输出“这不是一个大写字母”的英文信息(要求:能连续输出直到输出“#”结束)。
P155 例4.13
DATA SEGMENT
STR DB 0DH,0…
c语言getc函数C语言中的getc()函数 (getc() function in C) Prototype: 原型: int getc(FILE *filename);Parameters: 参数: FILE *filenameReturn type: int 返回类型: int Use of function: 使用功能: In the file handling…
c语言feof函数C语言中的feof()函数 (feof() function in C) Prototype: 原型: int feof(FILE* filename);Parameters: 参数: FILE *filenameReturn type: int(0 or 1) 返回类型: int(0或1) Use of function: 使用功能: In C l…
Modules used: 使用的模块: For this, we will use the opencv-python module which provides us various functions to work on images. 为此,我们将使用opencv-python模块,该模块为我们提供了处理图像的各种功能。 Download opencv-pytho…
mcq 队列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何称呼在Linux中存储加密的用户密码的技术? System Password Management 系统密码管理 Shadow Password 影子密码 Encrypted Password 加密密码 None of the…