已解决
Intel汇编语言程序设计(第7版)第六章编程学习过程中写的小例子
来自网友在路上 160860提问 提问时间:2023-09-26 18:23:22阅读次数: 60
最佳答案 问答题库608位专家为你答疑解惑
1. 根据书上的例子, 自己写的4个过程, 改了一部分
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib.data
dwNum0 DWORD 15
dwNum1 DWORD 21PDWORD TYPEDEF PTR DWORD dwNumAry DWORD 25, 39, 14, 59
NumAryLen DWORD LENGTHOF dwNumAry.code
; 找到两个数中的更大数
BigOne PROC Num0:DWORD, Num1:DWORDmov eax, Num0cmp eax, Num1ja NUM0BIGje EQUALmov eax, Num1jmp NUM0BIG
EQUAL:xor eax, eax
NUM0BIG:ret
BigOne ENDP; 数组求最大值
Biggest PROC USES esi ebx ecx pdwAry:PDWORD, dwCnt:DWORDmov ebx, pdwArymov ecx, dwCntmov esi, 1mov eax, DWORD PTR [ebx]
L0:cmp eax, DWORD PTR [ebx + esi * TYPE DWORD]jae NOMAXmov eax, DWORD PTR [ebx + esi * TYPE DWORD]
NOMAX:inc esi dec ecxor ecx, ecxjnz L0ret
Biggest ENDP; 直到按下按键在退出循环
BrkUntilPushKey PROCL0:mov eax, 100call Delaycall ReadKeyjz L0ret
BrkUntilPushKey ENDP; 在数组中找到对应值, 找到返回1否则0
SearchNum PROC USES esi ecx pdwAry:PDWORD, dwAryCnt:DWORD, dwObj:DWORDmov esi, pdwArymov eax, dwObjmov ecx, dwAryCnt
L0:cmp eax, DWORD PTR [esi]je foundadd esi, TYPE dwAryCntdec ecxtest ecx, ecxjnz L0jmp notfound
found:mov eax, 1jmp quit
notfound:xor eax, eax
quit:ret
SearchNum ENDPstart:push 39push NumAryLenpush OFFSET dwNumArycall SearchNumtest eax, eaxjz Endingcall WriteDeccall WaitMsg
Ending:invoke ExitProcess, 0
end start
2. 书上实现xor加密的例子
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib.data
; 字节类型的指针
PBYTE TYPEDEF PTR BYTE INPUTBUFSIZE = 256RetLine BYTE 0dh, 0ah, 0
szInputPrompt BYTE "输入明文: ", 0
szOutputPrompt BYTE "解密后的明文: ", 0
pszInput PBYTE OFFSET szInputPromptszInputBuf BYTE INPUTBUFSIZE DUP(0)
pszInputBuf PBYTE OFFSET szInputBuf
g_dwInputLen DWORD 0
g_bKey BYTE 0
.code GenKey PROC call Randomizecall Random32and eax, 0FFhretGenKey ENDPNextLine PROCpush eaxmov edx, OFFSET RetLinecall WriteStringpop eaxret
NextLine ENDPSymCryptic PROC USES esi pbTextBuf:PBYTE, dwTextSize:DWORD, bKey:BYTExor esi, esixor eax, eaxmov ebx, pbTextBuf
L0:mov al, BYTE PTR [ebx + esi]xor al, bKeymov BYTE PTR [ebx + esi], alinc esi cmp esi, dwTextSizejb L0retSymCryptic ENDP; 显示提示内容的封装函数
PrintPrompt PROC USES edx pShownString:PBYTE, pInputBuf:PBYTE, dwInputBufSize:DWORD; 打印提示输入mov edx, pShownStringcall WriteString; 让用户输入内容mov edx, pInputBufmov ecx, dwInputBufSizecall ReadStringretPrintPrompt ENDPstart:; 打印输入提示push SIZEOF szInputBufpush OFFSET szInputBufpush OFFSET szInputPromptcall PrintPromptmov g_dwInputLen, eax; 生成密钥call GenKeymov g_bKey, al; 进行对称加密invoke SymCryptic, pszInputBuf, g_dwInputLen, g_bKeymov edx, OFFSET szInputBufcall WriteString; 换行call NextLine; 显示解密后的明文mov edx, OFFSET szOutputPromptcall WriteString; 进行对称解密invoke SymCryptic, pszInputBuf, g_dwInputLen, g_bKeymov edx, pszInputBufcall WriteString; 换行call NextLinecall WaitMsginvoke ExitProcess, 0
end start
3. 计算数组内比50大的元素之和
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib.data
; 字节类型的指针
PBYTE TYPEDEF PTR BYTE array SDWORD 10, 60, 20, 33, 72, 89, 45, 65, 72, 18
ArraySize SDWORD ($ - array) / TYPE arraysample SDWORD 50
index SDWORD 0
sum SDWORD 0.code
start:xor ecx, ecxmov esi, OFFSET arrayxor eax, eaxL0:cmp ecx, ArraySizejge Endingmov ebx, samplecmp ebx, SDWORD PTR [esi]jge NextLoopadd eax, SDWORD PTR [esi]
NextLoop:inc ecxadd esi, TYPE arrayjmp L0
Ending:mov sum, eaxcall WriteIntcall WaitMsginvoke ExitProcess, 0
end start
4. 表驱动选择
如果选择分支过多可以构造一张表专门指向对应的地址
include irvine32.inc
includelib irvine32.lib
include msvcrt.inc
includelib msvcrt.lib.data CaseTable BYTE 'A'DWORD Process_A
EntrySize = ($ - CaseTable)BYTE 'B'DWORD Process_BBYTE 'C'DWORD Process_CBYTE 'D'DWORD Process_D
NumberOfEntries = ($ - CaseTable) / EntrySize
Prompt BYTE "Press capital A, B, C or D: ", 0msgA BYTE "Process_A", 0
msgB BYTE "Process_B", 0
msgC BYTE "Process_C", 0
msgD BYTE "Process_D", 0.code
Process_A PROCmov edx, OFFSET msgAret
Process_A ENDPProcess_B PROCmov edx, OFFSET msgBret
Process_B ENDPProcess_C PROCmov edx, OFFSET msgCret
Process_C ENDPProcess_D PROCmov edx, OFFSET msgDret
Process_D ENDPstart:mov edx, OFFSET Promptcall WriteStringcall ReadCharmov ebx, OFFSET CaseTablemov ecx, NumberOfEntries
L1:cmp al, [ebx]jne L2call DWORD PTR [ebx + 1]call WriteStringcall Crlfjmp L3
L2:add ebx, EntrySizeloop L1L3:call WaitMsginvoke ExitProcess, 0
end start
(完)
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Intel汇编语言程序设计(第7版)第六章编程学习过程中写的小例子":http://eshow365.cn/6-14102-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!