ARM汇编求正数负数个数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM汇编求正数负数个数相关的知识,希望对你有一定的参考价值。

用ARM代码啊

这里没人回答的,别人上班的哪有功夫回答问题。


ARM汇编分很多种的,首先ARM公司的编译器就和GNU的开源编译器不一样,如果你搞移动平台当然要选GNU的了,ios和安卓的底层汇编都是这个风格。 

ARM还分 ARM汇编、thumb 汇编

现在cortex -a 都是thumb-2

ARMV6和ARMV7的指令集都不一样,最新的ARMv8更不一样。


我这个是ARMV7-M指令集,手机上A8、A9是ARMV7指令集,

虽然差了各-M但是一不一样,-M有除法指令


fushu: .int 2,3,5,3,-1,-2,-4,-7,-8,-133,-444


shiyan:

ldr r0, = fushu

mov r2, # 11

bl fushugeshu

sub r7, # 8

ldr r0, [r7] @ r0 = 负数个数

ldr r1, [r7, # 4] @ r1 = 正数个数

b tiaochushiyan


fushugeshu: @ 入口r0=数组地址 r2=数据个数 

push r0-r6,lr

mov r5, # 0

mov r6, r5

mov r7, sp

sub sp, sp, # 8

ldr r3, = 0x8000000

chongfu:

ldr r4, [r0], # 4

tst r4, r3

ite ne

addne r5, # 1

addeq r6, # 1

subs r2, # 1

bne chongfu

str r5, [sp]

str r6, [sp, # 4]

add sp, # 8

pop r0-r6,pc


tiaochushiyan:

b tiaochushiyan

参考技术A it怎么写复数

8086汇编求最小公约数(输入支持正数负数,支持5位整数,有提示信息)


图 1 运行示意(正数、负数)


图 2 运行示意(四位整数)


图 3 运行示意(五位整数)


图 4 运行示意(正数、负数)

stack	segment stack
        db 512 dup(?)
stack	ends

data    segment
        string1 db 'Enter the first number M:', 0ah, 0dh, '$'
		string2 db 'Enter the first number N:', 0ah, 0dh, '$'
		string3 db 'The greatest common divisor(GCD) of M and N is:', 0ah, 0dh, '$'
data    ends

code 	segment
        assume ds: data, cs: code, ss: stack

start:
		mov 	ax, stack
		mov 	ss, ax
		mov		ax, data
		mov		ds, ax
		
		lea 	dx, string1
		mov 	bh, ah
		mov 	ah, 09h
		int 	21h
		mov 	ah, bh
		
		push	ax
		call	far ptr readsiw
		
		lea 	dx, string2
		mov 	bh, ah
		mov 	ah, 09h
		int 	21h
		mov 	ah, bh
		
		push	ax
		call	far ptr readsiw
		push	ax
		call	far ptr gcd
		
		lea 	dx, string3
		mov 	bh, ah
		mov 	ah, 09h
		int 	21h
		mov 	ah, bh
		
		call	far ptr dispsiw
		call	far ptr lineFeed
		jmp		done

readsiw proc far
		push bx
		push cx
		push dx
		xor bx, bx   
		xor cx, cx   
		mov ah, 1
		int 21h
		cmp al, '+'
		jz rsiw1
		cmp al, '-'
		jnz rsiw2
		mov cx, -1
rsiw1: 
		mov ah,  1
		int 21h
rsiw2:    
		cmp al, '0'
		jb rsiw3
		cmp al, '9'
		ja rsiw3
		sub al, 30h
		xor ah, ah
		shl bx, 1
		mov dx, bx
		shl bx, 1
		shl bx, 1
		add bx, dx
		add bx, ax
		jmp rsiw1
rsiw3:
		cmp cx, 0
		jz rsiw4
		neg bx
rsiw4:
		mov ax, bx
		pop dx
		pop cx
		pop bx
		ret
readsiw endp

dispsiw proc far
		push ax
		push bx
		push dx
		test ax, ax 
		jnz dsiw1
		mov dl, '0' 
		mov ah, 2
		int 21h
		jmp dsiw5
dsiw1:
		jns dsiw2  
		mov bx, ax
		mov dl, '-'
		mov ah, 2
		int 21h
		mov ax, bx
		neg ax 
dsiw2:  
		mov bx, 10
		push bx 
dsiw3:
		cmp ax, 0
		jz dsiw4
		xor dx, dx 
		div bx  
		add dl, 30h  
		push dx     
		jmp dsiw3
dsiw4:
		pop dx
		cmp dl, 10
		je dsiw5
		mov ah, 2
		int 21h
		jmp dsiw4
dsiw5:
		pop dx
		pop bx
		pop ax
		ret
dispsiw endp

lineFeed proc far
		push ax
		push dx
		mov dl, 0dh
		mov ah, 2
		int 21h
		mov dl, 0ah
		mov ah, 2
		int 21h
		pop dx
		pop ax
		ret
lineFeed endp

gcd		proc	far
		push	bp
		mov	bp,sp
		push	si
		push	di
		mov	si,word ptr [bp+6]
		mov	di,word ptr [bp+8]
		jmp	short @2@58
@2@58:
		mov	ax,si
		cwd	
		idiv	di
		mov	si,dx
		mov	ax,dx
		xor	di,ax
		mov	ax,di
		xor	si,ax
		mov	ax,si
		xor	di,ax
		jne	short @2@58
	  
		mov	ax,si
		jmp	short @2@114
@2@114:
		pop	di
		pop	si
		pop	bp
		ret	
gcd		endp

done:
		mov 	ax, 4c00h
		int 	21h	
	
code	ends

		end start

以上是关于ARM汇编求正数负数个数的主要内容,如果未能解决你的问题,请参考以下文章

用arm的汇编语言,求1到50的累加和,记住是arm下的汇编语言

8086汇编求最小公约数(输入支持正数负数,支持5位整数,有提示信息)

ARM中C和汇编的相互调用(5个数求和字符串拷贝)

编写一段ARM汇编程序段,实现1+2+...+100的运算

用ARM汇编语言编写程序实现:求寄存器R0和R1中两个整数的最大公约数并将结果存储在R0中

ARM(CM3)的汇编指令