80x86汇编语言写一个过程Preeven,判断一个串中偶数元素(用位运算)的个数,通过堆栈传递两个参数,一个是串的首地址,一个是串中元素个数的完整程序
时间: 2024-02-06 22:10:46 浏览: 145
以下是80x86汇编语言写的过程Preeven:
```assembly
Preeven PROC
push ebp
mov ebp, esp
push ebx
push ecx
push edx
mov ebx, [ebp+8] ; ebx为串的首地址
mov ecx, [ebp+12] ; ecx为串中元素个数
xor edx, edx ; edx清零
mov eax, ecx ; eax为计数器
loop_start:
test byte ptr [ebx], 01h ; 检查最低位,判断奇偶性
jz even ; 偶数跳转到even标签
odd:
dec eax ; 计数器减1
jmp next
even:
inc edx ; 偶数计数器加1
next:
inc ebx ; 移动到下一个元素
loop loop_start ; 循环
mov eax, edx ; edx中存储的即为偶数元素个数
pop edx
pop ecx
pop ebx
mov esp, ebp
pop ebp
ret
Preeven ENDP
```
完整程序如下:
```assembly
TITLE Preeven - Count the number of even elements in a string using bitwise operations
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
Preeven PROTO, pStr:DWORD, nCount:DWORD
.data
str1 db 0, 2, 4, 6, 8, 10, 12, 14
nCount1 dd 8
str2 db 1, 3, 5, 7, 9, 11, 13, 15
nCount2 dd 8
.code
main PROC
; Test case 1
INVOKE Preeven, OFFSET str1, nCount1
mov ebx, eax ; 将结果保存到ebx中
mov eax, ebx ; 将结果输出
call WriteDec
call CRLF
; Test case 2
INVOKE Preeven, OFFSET str2, nCount2
mov ebx, eax ; 将结果保存到ebx中
mov eax, ebx ; 将结果输出
call WriteDec
call CRLF
INVOKE ExitProcess, 0
main ENDP
Preeven PROC
push ebp
mov ebp, esp
push ebx
push ecx
push edx
mov ebx, [ebp+8] ; ebx为串的首地址
mov ecx, [ebp+12] ; ecx为串中元素个数
xor edx, edx ; edx清零
mov eax, ecx ; eax为计数器
loop_start:
test byte ptr [ebx], 01h ; 检查最低位,判断奇偶性
jz even ; 偶数跳转到even标签
odd:
dec eax ; 计数器减1
jmp next
even:
inc edx ; 偶数计数器加1
next:
inc ebx ; 移动到下一个元素
loop loop_start ; 循环
mov eax, edx ; edx中存储的即为偶数元素个数
pop edx
pop ecx
pop ebx
mov esp, ebp
pop ebp
ret
Preeven ENDP
END main
```
程序中,我们先定义了两个测试用的字符串str1和str2,以及它们各自的元素个数nCount1和nCount2。然后,调用了Preeven过程,分别传入了这两个字符串的首地址和元素个数。Preeven过程遍历了整个串,使用位运算判断每个元素的奇偶性,并统计偶数元素的个数,最后返回偶数元素的个数。在main过程中,我们将Preeven的返回值保存到ebx中,并输出了这个值。最后,调用了ExitProcess结束程序的运行。
阅读全文