5.1
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat,stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
num DWORD 0FFFFFF9Ch
snum BYTE 21 DUP('A')
bnum DWORD 1,2,3,4,5,6,7
myArray WORD 20 DUP(?)
sizes = ($-myArray)
color WORD 0, 4*16, 8*16, 12*16
.code
main PROC
mov ecx, LENGTHOF color
mov esi, 0
l1:
mov ax, yellow
add ax, color[esi]
call SetTextColor
add esi, TYPE color
call DumpRegs
loop l1
INVOKE ExitProcess, 0
main ENDP
END main
5.2
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat,stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
tmp DWORD ?
num = 45
dwData DWORD 1, 1, num DUP(?)
filename BYTE "myfile.txt", 0
.code
main PROC
call createnum
call writenum
INVOKE ExitProcess, 0
main ENDP
createnum PROC
pushad
mov eax, 1
mov ebx, 1
mov ecx, num
mov esi, 2*(TYPE dwData)
l1:
mov tmp ,ebx
add ebx, eax
mov eax, tmp
mov dwData[esi], ebx
add esi, TYPE dwData
loop L1
popad
ret
createnum ENDP
writenum PROC
mov edx, OFFSET filename
call CreateOutputFile
mov edx, OFFSET dwData
mov ecx, SIZEOF dwData
call WriteToFile
ret
writenum ENDP
END main
5.3
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
TAB = 9
.data
aName BYTE "Lincoln",0
nameSize = ($-aName) - 1
INTEGER_COUNT = 2
str1 BYTE "enter a :", 0
str2 BYTE "The sum is:", 0
array DWORD INTEGER_COUNT DUP(?)
.code
main PROC
call Clrscr
mov esi, OFFSET array
mov ecx, INTEGER_COUNT
call PromptForIntegers
call ArraySum
call DisplaySum
INVOKE ExitProcess, 0
main ENDP
PromptForIntegers PROC USES ecx edx esi
mov edx, OFFSET str1
L1:
call WriteString
call ReadInt
call Crlf
mov [esi], eax
add esi, TYPE DWORD
loop L1
ret
PromptForIntegers ENDP
ArraySum PROC USES esi ecx
mov eax, 0
L1:
add eax, [esi]
add esi, TYPE DWORD
loop L1
ret
ArraySum ENDP
DisplaySum PROC USES edx
mov edx, OFFSET str2
call WriteString
call WriteInt
call Crlf
ret
DisplaySum ENDP
END main
5.4
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
TAB = 9
.data
aName BYTE "Lincoln",0
nameSize = ($-aName) - 1
INTEGER_COUNT = 2
str1 BYTE "enter a :", 0
str2 BYTE "The sum is:", 0
array DWORD INTEGER_COUNT DUP(?)
num = 3
.code
main PROC
mov ecx, num
l0:
push ecx
call Clrscr
mov esi, OFFSET array
mov ecx, INTEGER_COUNT
call PromptForIntegers
call ArraySum
call DisplaySum
pop ecx
loop l0
INVOKE ExitProcess, 0
loop l0
main ENDP
PromptForIntegers PROC USES ecx edx esi
mov edx, OFFSET str1
L1:
call WriteString
call ReadInt
call Crlf
mov [esi], eax
add esi, TYPE DWORD
loop L1
ret
PromptForIntegers ENDP
ArraySum PROC USES esi ecx
mov eax, 0
L1:
add eax, [esi]
add esi, TYPE DWORD
loop L1
ret
ArraySum ENDP
DisplaySum PROC USES edx
mov edx, OFFSET str2
call WriteString
call WriteInt
call Crlf
ret
DisplaySum ENDP
END main
5.5
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
num = 50
TAB = 9
.code
main PROC
mov ecx, num
l1:
mov eax, 40
call RandomRange
sub eax, 20
call WriteInt
mov al, TAB
call WriteChar
loop l1
INVOKE ExitProcess, 0
main ENDP
END main
5.6
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
index = 10
TAB = 9
totalnum = 20
.code
main PROC
mov ecx, totalnum
l0:
push ecx
mov al, TAB
call WriteChar
mov ecx, index
l1:
mov eax, 26
call RandomRange
add eax, 65
call WriteChar
loop l1
pop ecx
loop l0
INVOKE ExitProcess, 0
main ENDP
END main
5.7
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
index = 10
TAB = 9
totalnum = 100
nchar = 'A'
.code
main PROC
mov ecx, totalnum
l0:
call GetMaxXY
movzx eax, dh
call RandomRange
mov dh, al
movzx eax, dl
call RandomRange
mov dl, al
call Gotoxy
mov eax, nchar
call WriteChar
mov eax, 100
call Delay
loop l0
INVOKE ExitProcess, 0
main ENDP
END main
5.8
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
num = 16
nchar DWORD 'A'
.code
main PROC
mov ecx, num
l0:
push ecx
mov eax, ecx
sub eax, 1
shl ax, 4
mov ecx, num
l1:
add eax, ecx
dec eax
call SetTextColor
mov eax, nchar
call WriteChar
loop l1
pop ecx
loop l0
INVOKE ExitProcess, 0
main ENDP
END main
5.9
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
TAB = 9
.data
aName BYTE "Lincoln",0
nameSize = ($-aName) - 1
ARRAY_SIZE = 10
array DWORD ARRAY_SIZE DUP(?)
str1 BYTE "enter num :", 0
str2 BYTE "The sum is:", 0
str3 BYTE "How many intrgers wile be added?",0
str4 BYTE "The array cannot be larger than ",0
.code
main PROC
call Clrscr
mov edx, OFFSET str3
call WriteString
call ReadInt
cmp eax, ARRAY_SIZE
ja endsn
mov esi, OFFSET array
mov ecx, eax
call PromptForIntegers
call ArraySum
call DisplaySum
jmp endo
endsn:
mov edx, OFFSET str4
call WriteString
mov eax, ARRAY_SIZE
call WriteDec
endo:
INVOKE ExitProcess, 0
main ENDP
PromptForIntegers PROC USES ecx edx esi
mov edx, OFFSET str1
L1:
call WriteString
call ReadInt
call Crlf
mov [esi], eax
add esi, TYPE DWORD
loop L1
ret
PromptForIntegers ENDP
ArraySum PROC USES esi ecx
mov eax, 0
L1:
add eax, [esi]
add esi, TYPE DWORD
loop L1
ret
ArraySum ENDP
DisplaySum PROC USES edx
mov edx, OFFSET str2
call WriteString
call WriteInt
call Crlf
ret
DisplaySum ENDP
END main
7.1
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
op1 QWORD 0000000000000002h, 0000000000000002h, 0000000000000002h, 9000000000000002h
op2 QWORD 0000000000000002h, 0000000000000002h, 0000000000000002h, 9000000000000002h
sum DWORD 9 DUP(0ffffffffh)
.code
Extended_Add PROC
pushad
clc
l1:
mov eax, [esi]
adc eax, [edi]
pushfd
mov [ebx], eax
add esi, 4
add edi, 4
add ebx, 4
popfd
loop l1
mov dword ptr[ebx],0
adc dword ptr[ebx],0
popad
ret
Extended_Add ENDP
main PROC
mov esi, OFFSET op1
mov edi, OFFSET op2
mov ebx, OFFSET sum
mov ecx, 8
call Extended_Add
mov ecx, 9
mov esi, 8
l2: mov eax, sum[esi*TYPE DWORD]
call WriteHex
dec esi
loop l2
push 0
call ExitProcess
main ENDP
END main
7.2
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
op1 QWORD 7000000000000002h, 0000000000000002h, 0000000000000002h, 9000000000000002h
op2 QWORD 8000000000000002h, 0000000000000002h, 0000000000000002h, 9000000000000002h
sum DWORD 9 DUP(0ffffffffh)
.code
Extended_sub PROC
pushad
clc
l1:
mov eax, [esi]
sbb eax, [edi]
pushfd
mov [ebx], eax
add esi, 4
add edi, 4
add ebx, 4
popfd
loop l1
mov dword ptr[ebx],0
sbb dword ptr[ebx],0
popad
ret
Extended_sub ENDP
main PROC
mov esi, OFFSET op1
mov edi, OFFSET op2
mov ebx, OFFSET sum
mov ecx, 8
call Extended_sub
mov ecx, 9
mov esi, 8
l2: mov eax, sum[esi*TYPE DWORD]
call WriteHex
dec esi
loop l2
push 0
call ExitProcess
main ENDP
END main
7.3
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
time WORD 0001001000000111b
astr BYTE ":",0
.code
ShowFileTime PROC
push ax
and ax, 11111b
mov bx, 2
mul bx
mov bx, ax ;bx=second
pop ax
push ax
shr ax, 5
and ax, 11111b
mov cx, ax
pop ax
push ax
shr ax, 11
and ax, 11111b
mov dx, ax
pop ax
ret
ShowFileTime ENDP
main PROC
mov eax, 0
mov ax, time
call ShowFileTime
movzx eax, dx
call WriteDec
mov edx, OFFSET astr
call WriteString
movzx eax, cx
call WriteDec
mov edx, OFFSET astr
call WriteString
movzx eax, bx
call WriteDec
push 0
call ExitProcess
main ENDP
END main
9.1
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
sourcestr BYTE "123456",0
targetstr BYTE 100 DUP(0)
max_length = 3 ;=10
.code
Str_copy_N PROC USES eax ecx esi edi,
source:PTR BYTE,
target:PTR BYTE,
maxLength:DWORD
INVOKE Str_length, source
cmp eax, maxLength
jbe l1
mov eax, maxLength
l1:
mov ecx, eax
mov esi, source
mov edi, target
cld
rep movsb
ret
Str_copy_N ENDP
main PROC
push max_length
push OFFSET targetstr
push OFFSET sourcestr
call Str_copy_N
mov edx, OFFSET targetstr
call WriteString
push 0
call ExitProcess
main ENDP
END main
7.4
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
data1 DWORD 12h, 23h, 45h, 1111111h, 2222h
astr BYTE " ",0
bstr BYTE 0dh, 0ah, 0
.code
shrd_ex PROC
mov ecx, 4
l3:
mov eax, [esi-4]
shrd dword ptr[esi], eax, 16
sub esi, 4
loop l3
ret
shrd_ex ENDP
main PROC
mov ecx, LENGTHOF data1
mov esi, 0
l1:
mov eax, data1[esi*TYPE data1]
call Writehex
mov edx, OFFSET astr
call WriteString
inc esi
loop l1
mov ecx, 2
l3:
push ecx
mov esi, OFFSET data1 + 16
call shrd_ex
pop ecx
loop l3
mov edx, OFFSET bstr
call WriteString
mov ecx, LENGTHOF data1
mov esi, 0
l2:
mov eax, data1[esi*TYPE data1]
call Writehex
mov edx, OFFSET astr
call WriteString
inc esi
loop l2
push 0
call ExitProcess
main ENDP
END main
7.5
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
.code
FastMultiply PROC
mov edx, 32
mov cl, 0
mov edi, 0 ;save the sum
l1:
shr ebx, 1
jnc l2
push eax
shl eax, cl
add edi, eax
pop eax
l2:
inc cl
dec edx
cmp edx, 0
jne l1
mov eax, edi
ret
FastMultiply ENDP
main PROC
mov ebx, 23
mov eax, 4
call FastMultiply
call WriteDec
push 0
call ExitProcess
main ENDP
END main
7.6
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
x SDWORD 25
y SDWORD -100
.code
GCD PROC
cmp eax, 0
jg l1
neg eax
l1:
cmp ebx, 0
jg l2
neg ebx
l2:
cdq
idiv ebx
mov eax,ebx
mov ebx, edx
cmp ebx, 0
jg l2
ret
GCD ENDP
main PROC
mov eax, x
mov ebx, y
call GCD
call WriteDec
push 0
call ExitProcess
main ENDP
END main
7.7
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
astr BYTE "Is Prime", 0
.code
IsPrime PROC
mov edi, eax
mov ebx, 2
mov edx, 0
div ebx
mov ecx, eax
l1:
mov eax, edi
mov edx, 0
div ecx
cmp edx,0
jz l2
cmp ecx,2
loopnz l1
and eax, 0
jmp l3
l2: or eax, 1
l3:
ret
IsPrime ENDP
main PROC
mov eax, 7
call IsPrime
jnz l2
l1:
mov edx, OFFSET astr
call WriteString
l2: push 0
call ExitProcess
main ENDP
END main
9.2
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
sourcestr BYTE "123456",0
targetstr BYTE "FTY", 10 DUP(0), 0
.code
Str_concat PROC,
target:PTR BYTE,
source:PTR BYTE
pushad
INVOKE Str_length, target
mov esi, source
mov edi, target
add edi, eax
INVOKE Str_length, source
mov ecx, eax
rep movsb
popad
ret
Str_concat ENDP
main PROC
push OFFSET sourcestr
push OFFSET targetstr
call Str_concat
mov edx, OFFSET targetstr
call WriteString
push 0
call ExitProcess
main ENDP
END main
9.3
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
targetstr BYTE "abcxxxx1234567",0
.code
Str_remove PROC,
pString:PTR BYTE,
num:DWORD
INVOKE Str_length, pString
mov ecx, eax
sub ecx, num
mov edi, pString
mov esi, edi
add esi, num
cld
rep movsb
mov byte ptr[edi], 0
ret
Str_remove ENDP
main PROC
push 4
push OFFSET targetstr +3
call Str_remove
mov edx, OFFSET targetstr
call WriteString
push 0
call ExitProcess
main ENDP
END main
9.4
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
target BYTE "112ABCDCDCD123456A", 0
source BYTE "ABC", 0
.code
Str_find PROC,
sourcestr:ptr byte,
targetstr:ptr byte
INVOKE Str_length, sourcestr
mov edx, eax ;获取源字符串长度
INVOKE Str_length, targetstr
mov ecx, eax ;获取目的字符串长度
sub ecx, edx
mov ebx, 0 ;目的字符串哨兵
l1:
push ecx
mov esi, sourcestr
mov ecx, edx
mov edi, targetstr
add edi, ebx
cld
repe cmpsb
jz l2 ;找到匹配字符串
inc ebx
pop ecx
loop l1
jmp l3 ;未找到匹配字符串
l2:
pop ecx
pushfd
sub eax, ecx
sub eax, edx
popfd
l3:
ret
Str_find ENDP
main PROC
push OFFSET target
push OFFSET source
call Str_find
push 0
call ExitProcess
main ENDP
END main
9.5
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
target BYTE "Johnson,Calvin", 0
.code
Str_nextword PROC,
targetstr:PTR BYTE,
jchar:BYTE
mov edi, targetstr
mov al, jchar
repne scasb
je l1
jmp l2
l1:
mov eax, edi
mov byte ptr[edi-1], 0
l2:
ret
Str_nextword ENDP
main PROC
push ','
push OFFSET target
call Str_nextword
mov edx, OFFSET target
call WriteString
call DumpRegs
push 0
call ExitProcess
main ENDP
END main
9.6
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
target BYTE "ABCDEFAG",0
freqTable DWORD 256 DUP(0)
.code
Get_frequencies PROC,
targetstr:PTR BYTE,
freqTables:PTR DWORD
mov ecx, targetstr
mov edx, freqTables
mov esi, 0
mov edi, 0
l1:
movzx eax, BYTE PTR[ecx + esi*TYPE BYTE]
cmp eax, 0
je l2
inc dword ptr[edx + eax*TYPE DWORD]
inc esi
inc edi
jmp l1
l2:
ret
Get_frequencies ENDP
main PROC
push OFFSET freqTable
push OFFSET target
call Get_frequencies
push 0
call ExitProcess
main ENDP
END main
9.7
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
num = 200
.data?
array BYTE num DUP(?)
half DWORD ?
.data
strt BYTE " ", 0
.code
main PROC
mov ecx,LENGTHOF array
mov al, 0
mov edi, OFFSET array
cld
rep stosb
mov edx, 0
mov eax, num
mov ebx, 2
div ebx
mov half, eax
mov ebx, OFFSET array ;start addr of array
mov edi, ebx
add edi, 2*TYPE BYTE
l1:
mov al, 1
mov ecx, num
cld
repe scasb
mov ecx, edi
sub ecx, ebx
dec ecx
cmp ecx, half
ja endw
mov eax, 2
l3:
push eax
mul ecx
cmp eax, num
jae l2
mov array[eax*TYPE BYTE], 1
pop eax
inc eax
jmp l3
l2:
jmp l1
endw:
mov ecx, LENGTHOF array
mov esi, 0
l4:
cmp array[esi], 0
jne l5
mov eax, esi
call WriteDec
mov edx, OFFSET strt
call WriteString
l5:
inc esi
loop l4
push 0
call ExitProcess
main ENDP
END main
9.8
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
array DWORD 2, 1, 3, 4
.code
BubbleSort PROC USES eax ecx esi,
pArray:PTR DWORD,
Count:DWORD
mov ecx, Count
dec ecx
mov edx, 0
l1:
push ecx
mov esi, pArray
mov edx, 0 ;检查位
l2:
mov eax, [esi]
cmp [esi+4], eax
jg l3
mov edx, 1
xchg eax, [esi+4]
mov [esi], eax
l3: add esi, 4
loop l2
pop ecx
cmp edx, 0
je l4
loop l1
l4: ret
BubbleSort ENDP
main PROC
mov edi, OFFSET array
mov ecx, LENGTHOF array
push ecx
push edi
call BubbleSort
push 0
call ExitProcess
main ENDP
END main
9.9
TITLE Add and Subtract
; This program adds and subtracts 32-bit integers.
; Last update: 06/01/2006
.386
.model flat, stdcall
.stack 4096
INCLUDE Irvine32.inc
.data
array DWORD 1,2,4,5,9,12,18,20,100,102
.code
BinarySearch PROC uses ebx edx esi edi,
pArray:PTR DWORD,
Count:DWORD,
searchVal:DWORD
mov eax, 0; eax=first
mov ebx, Count
dec ebx ;ebx=last
mov edi, searchVal
mov edx, pArray
l1:
cmp eax, ebx
jg l5
push eax
push ebx
add eax, ebx
shr eax, 1
mov esi, eax
shl esi, 2
mov ebx, [edx+esi]
cmp ebx, edi
jge l2
pop ebx
pop esi
inc eax
jmp l4
l2:
cmp ebx, edi
jle l3
mov ebx, eax
dec ebx
pop esi
pop eax
jmp l4
l3:
pop esi
pop esi
jmp l9
l4:
jmp l1
l5:
mov eax, -1
l9: ret
BinarySearch ENDP
main PROC
mov eax, 103
push eax
push LENGTHOF array
push OFFSET array
call BinarySearch
call WriteDec
push 0
call ExitProcess
main ENDP
END main
9.10
.model flat, stdcall
INCLUDE Irvine32.inc
.data
astr BYTE "AEIOU"
bstr BYTE "BCDFGHJKLMNPQRSTVWXYZ"
cstr BYTE 0dh,0ah,0
dstr BYTE 0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0
.code
main PROC
mov ecx, 3
l6:
push ecx
mov ecx, 4
l5:
push ecx
mov ecx, 4
l4:
mov eax, 2
call RandomRange
cmp eax, 0
je l1
mov eax, LENGTHOF astr
call RandomRange
mov bl, astr[eax*TYPE BYTE]
jmp l2
l1:
mov eax, LENGTHOF bstr
call RandomRange
mov bl, bstr[eax*TYPE BYTE]
l2:
mov al, bl
call WriteChar
loop l4
mov edx, OFFSET cstr
call WriteString
pop ecx
loop l5
mov edx, OFFSET dstr
call WriteString
pop ecx
loop l6
exit
main ENDP
END main
9.11
.model flat, stdcall
INCLUDE Irvine32.inc
.data
astr BYTE "AEIOU"
arrstr BYTE 'P','O','A','Z'
BYTE 'A','E','A','U'
BYTE 'G','K','A','E'
BYTE 'I','B','G','D'
bstr BYTE 0dh,0ah,0
.code
dect PROC
push ebp
mov ebp, esp
push esi
push ecx
push ebx
push edi
mov esi, [ebp+8] ;addr of array
mov ecx, [ebp+12] ;count
mov ebx, 0
l1:
push ecx
cld
lodsb
mov ecx, LENGTHOF astr
mov edi, OFFSET astr
repne scasb
jne l2
inc ebx
l2:
pop ecx
loop l1
mov eax, ebx
pop edi
pop ebx
pop ecx
pop esi
leave
ret 8
dect ENDP
displaychar PROC
push ebp
mov ebp, esp
push esi
push ecx
push eax
mov esi, [ebp+8]
mov ecx, [ebp+12]
ld:
lodsb
call WriteChar
loop ld
pop eax
pop ecx
pop esi
leave
ret 8
displaychar ENDP
main PROC
mov esi, 0
mov ecx, 4
lr:
mov eax, 4
push eax
mov ebx, OFFSET arrstr
add ebx, esi
push ebx
call dect
cmp eax, 2
jne ltb
push 4
push ebx
call displaychar
mov edx, OFFSET bstr
call WriteString
ltb:
add esi,4
loop lr
push 0
call ExitProcess
main ENDP
END main
9.12
.model flat, stdcall
INCLUDE Irvine32.inc
.data
arrstr WORD 2,34,3,56
rowsize = $ - arrstr
WORD 2,2,2,2
WORD 4,5,1,0
WORD 0,1,3,5
.code
calc_row_sum PROC
push ebp
mov ebp, esp
mov esi, [ebp+8];数组偏移
mov eax, [ebp+12];行的大小
mov ebx, [ebp+16];数组类型
push eax
mov edx, 0
div ebx
mov ecx, eax ;ecx为行的元素个数
pop eax
mov edx, [ebp+20];行的索引
mul edx
mov edi, eax
add edi, esi ;edi为行元素首地址
mov esi, 0
l1:
cmp ebx, 1
jne l2
movzx eax, byte ptr[edi+esi*1]
jmp l4
l2: cmp ebx, 2
jne l3
movzx eax, word ptr[edi+esi*2]
jmp l4
l3: mov eax, dword ptr[edi+esi*4]
l4:
add edx, eax
inc esi
loop l1
mov eax, edx
leave
ret 16
calc_row_sum ENDP
main PROC
mov eax, 2 ;行索引
push eax
mov eax, TYPE arrstr ;数组的类型
push eax
mov eax, rowsize ;行的大小
push eax
push OFFSET arrstr ;数组偏移
call calc_row_sum
call WriteDec
push 0
call ExitProcess
main ENDP
END main