读取数字的子程序—小于65536的无符号数

 View Code ASM

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
DATAS SEGMENT
    ;此处输入数据段代码
    scanf db 'asdddaaaaa'
    a 	  dw 20 dup(?)
DATAS ENDS
;INC会影响标志位
STACKS SEGMENT
    ;此处输入堆栈段代码
    dw 50 dup()
    top equ this word
STACKS ENDS
 
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    ;读入一个十进制数存成可直接使用的数字
  	lea bx,a
 	call readnum
	mov [bx],cx
	inc bx
	inc bx
    call readnum
    mov [bx],cx
    inc bx
    inc bx
	call readnum
    mov [bx],cx
    MOV AH,4CH
    INT 21H
readnum proc      ;读取一个数,以回车中断,数应小于256
				  ;如果大于256小于65 536
				  ;在调用储存时指针加2即可
				  ;返回的值储存在cx中
	push ax
	push bx
	push dx
	mov dx, offset scanf
 	mov ah, 0ah
 	int 21h
 	lea bx,scanf
 	xor ax,ax
 	inc bx
 	inc bx
 	xor cx,cx
 	xor dx,dx
s1:
	mov dl,[bx]
	cmp dl,0dh
	je s2
	push ax
	push bx
	xor ax,ax
	xor bx,bx
	mov ax,10
	sub dx,30h
	mov bx,cx
	push dx
	mul bx
	mov cx,ax
	pop dx
	add cx,dx
	pop bx
	pop ax
	inc bx
s2:
	jne s1
	pop dx
	pop bx
	pop ax
	ret
readnum endp
PRINTAX PROC          ;以10进制输出AX中的无符号整数.
      MOV  BX, 10     ;按10进制输出.
      OR   AX, AX
      JZ   _0_
LOOP_P:
      XOR  DX, DX
      DIV  BX
      MOV  CX, AX     ;商.
      OR   CX, DX
      JZ   _E_        ;若商与余数都为0则结束递归.
      PUSH DX         ;保存DX中的余数.
      CALL LOOP_P     ;递归.
      POP  DX         ;恢复余数.
      ADD  DL, '0'    ;变成ASCII码.
      JMP  _1_
_0_:  MOV  DL, '0'    ;是0则直接输出.
_1_:  MOV  AH, 2
      INT  21H
_E_:  RET
PRINTAX ENDP
CODES ENDS
    END START

本文出自 “DarkScope从这里开始(..” 博客,请务必保留此出处http://darkscope.blog.51cto.com/4254649/989032

设计一个名为FILTER的中值滤波子程序,用于处理无符号8位据,其存储在内存地址30H到4FH,总共有32个元素。中值滤波算法的目标是对这32个据点取中值作为新的值,以减少噪声并保留信号特性。步骤如下: 1. **声明变量**: - 定义一个临时组temp[16],用于存储原始据的一部分,方便后续处理。 - 另外,设置两个指针i和j分别指向当前正在处理的位置和中间位置。 2. **初始化和循环**: - 初始化i为30H(第一个据地址),j为8(因为中值滤波每移动8个位置就计算一次新值)。 - 当i小于或等于4FH(最后一个据地址+1)时,进入主循环。 3. **读取和复制据**: - 将原始据从地址30H开始的16个连续字节复制到temp组。 4. **排序组**: - 对temp组内的据进行排序,找到其中的第8个值,即中值。 5. **更新滤波结果**: - 将找到的中值存放在50H(滤波结果地址)处。 6. **移动指针和继续处理**: - i递增8,跳过已处理的部分,回到下一个窗口的起始位置。 - 如果i未超过4FH,则返回步骤3,继续下一轮处理;否则跳出循环。 7. **子程序结束**: - FILTER子程序完成,滤波结果保存在50H地址。 ```assembly ; 示例的伪代码(假设用某种汇编语言) FILTER PROC ; ... (其他指令) mov si, 30h ; Set SI to the start of input data mov di, 50h ; Set DI to the output result loop_start: lodsb ; Load a byte from input mov [temp], al ; Store in temp array inc si ; Move to next input cmp si, 4fh ; Check if all 16 values loaded jle loop_copy ; If not, continue copying ; ... (Sort temp array and find median) ; ... mov [di], al ; Copy median to output inc di ; Move to next output jmp loop_start ; Repeat until all processed loop_copy: ; ... (Copy remaining data if needed) FILTER ENDP ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值