1: 用不超过3条XCHG指令对4个8位寄存器的值重新排序,A,B,C,D调整为D,C,B,A
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,'A'
mov bl,'B'
mov cl,'C'
mov dl,'D'
xchg al,dl
xchg bl,cl
INVOKE ExitProcess,0
main ENDP
END main
2: 用一条算术运算指令和奇偶标志位判断信息字节是偶校验还是奇校验,设AL中的信息字节为0111 0101
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,75h ;假设信息字节为 0111 0101
add al,1 ;加1,如果奇偶标志位为1,那么信息字节就是偶校验否则是奇校验
INVOKE ExitProcess,0
main ENDP
END main
3: 用字节操作数实现两个负整数相加,使溢出标志位为1 用加法使零标志位和进位标志位同时置1 用减法使进位标志位为1 使用进位标志位与溢出标志位同时为1
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,81h
add al,80h ;溢出标志位为1
mov al,80h
add al,80h ;零标志位与进位标志位为1
mov al,70h
sub al,80h ;进位标志位为1
mov al,81h
add al,80h ;进位标志位与溢出标志位都为1
INVOKE ExitProcess,0
main ENDP
END main
4: 实现算术 EAX = -val2+7-val3+val1 AX = (val4+BX)-val5
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
val1 DWORD 11
val2 DWORD 22
val3 DWORD 33
val4 WORD 44
val5 WORD 55
.code
main PROC
;EAX = -val2+7-val3+val1
neg val2
mov eax,val2
add eax,7
sub eax,val3
add eax,val1
;AX = (val4+BX)-val5
mov ax,val4
add ax,bx
sub ax,val5
INVOKE ExitProcess,0
main ENDP
END main
5: 在一个双字数组中迭代,用带比例因子的变址寻址,计算元素总和
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
listD DWORD 1,2,3,4,5,6
.code
main PROC
mov eax,0
mov ecx,LENGTHOF listD
mov esi,ecx
L1:
sub esi,1
add eax,listD[esi * TYPE listD]
loop L1
INVOKE ExitProcess,0
main ENDP
END main
6: 多个常用运算符运用例子
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
lMyBytes LABEL WORD ;插入LABEL定义类型使用myBytes直接送入16位寄存器
myBytes BYTE 10h,20h,30h,40h
ALIGN 1 ;使用myBytes对齐到偶数地址
lMyWords LABEL DWORD ;插入LABEL定义类型使用myWords直接送入32位寄存器
myWords WORD 3 DUP(?),2000h
myStrings BYTE "ABCDE"
.code
main PROC
mov eax,TYPE myBytes ;1
mov eax,LENGTHOF myBytes ;4
mov eax,SIZEOF myBytes ;4
mov eax,TYPE myWords ;2
mov eax,LENGTHOF myWords;4
mov eax,SIZEOF myWords ;8
mov eax,SIZEOF myStrings ;5
mov dx,WORD PTR myBytes ;将myBytes前两个字节送往DX,值为2010h
mov al,BYTE PTR [myWords+1] ;将myWords的第二个字节送入AL
mov eax,DWORD PTR myBytes ;将myBytes全部四个字节送入EAX
mov eax,lMyWords ;使用LABEL定义的类型将myWords直接送入32位寄存器
mov ax,lMyBytes ;使用LABEL定义的类型将myBytes直接送入16位寄存器
INVOKE ExitProcess,0
main ENDP
END main
7: 大端转小端
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
bigEndian BYTE 12h,34h,56h,78h
littleEndian DWORD ?
.code
main PROC
mov eax,DWORD PTR bigEndian
mov littleEndian,eax
INVOKE ExitProcess,0
main ENDP
END main
8: 交换数组元素对,元素i与元素i+1交换,元素i+2与元素i+3交换
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
dwordList DWORD 1,2,3,4,5,6
.code
main PROC
mov ecx,LENGTHOF dwordList
mov eax,0
L1:
mov esi,dwordList[eax * TYPE dwordList]
inc eax
xchg esi,dwordList [eax * TYPE dwordList]
dec eax
mov dwordList [eax * TYPE dwordList],esi
add eax,2
dec ecx
loop L1
INVOKE ExitProcess,0
main ENDP
END main
9: 数组元素间隔之和,假设数组为0、2、5、9、10,则元素间隔为2、3、4、1,总和为10
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
dwordList DWORD 0,2,5,9,10
.code
main PROC
mov ecx,LENGTHOF dwordList -1
mov eax,0
L1: mov ebx,ecx
mov esi,dwordList[ebx * TYPE dwordList]
dec ebx
sub esi,dwordList[ebx * TYPE dwordList]
add eax,esi
loop L1
INVOKE ExitProcess,0
main ENDP
END main
10: 将字数组复制到双字数组
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
wordList WORD 1,2,3,4,5,6
dwordList DWORD 5 DUP(?)
.code
main PROC
mov ecx,LENGTHOF wordList
L1: dec ecx
movzx eax,wordList[ecx * TYPE wordList]
mov dwordList[ecx * TYPE dwordList],eax
inc ecx
loop L1
INVOKE ExitProcess,0
main ENDP
END main