汇编语言-005(XCHG、标志位操作、算术操作、比例因子的变址寻址、多个常用运算符运用、大端转小端、数组操作)

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值