【微机编程】汇编的一些优质算法

【1】回车换行

利用宏:
CRLF MACRO
	MOV AH,02H
	MOV DL,0DH
	INT 21H
	MOV AH,02H
	MOV DL,0AH
	INT 21H
ENDM

技巧:用表
CRLF DB 0AH,0DH,'$'
调用的话就直接使用:
MOV AH,9
LEA DX,CRLF
INT 21H

【2】键盘识别的ASCⅡ码转化为数字

与40H比较,小于40H,减两次,大于40H减一次

	MOV AH,1
	INT 21H
	CMP AL,40H
	JL L2
		;JG L1
		;JG L2
		;L1:	SUB AL,07H
	SUB AL,07H
L2:	SUB AL,30H

【3】AX是读得的数字,NUM是一个字,存放四个BCD码

NUM左移四位,加上读得数字存入表

	PUSH AX
	MOV AX,NUM
	MOV BX,16
	MUL BX
	POP BX
	ADC AL,BL		;这里用ADC,ADD没有影响,*16相当于左移四位,不影响进位
	MOV NUM,AX
	

【4】把NUM中的数字按二进制显示

循环16次,DL赋31H,对BX左移一位,判断高位移入的进位,用JC跳转-1与否

	MOV CX,16
	MOV BX,NUM
L4:	MOV DL,31H
	SAL BX,1
	JC L3
	DEC DL
L3:	MOV AH,2
	INT 21H
	LOOP L4

【5】逻辑尺

设有数组,X=[x1…x6] Y=[y1…y6]
试计算:Z1=X1+Y1、Z2=X2+Y2、Z3=X3-Y3、Z4=X4-Y4、Z5=X5-Y5、Z6=X6+Y6

ST:	MOV SI,0
	MOV CX,6
	MOV BX,11000100B	(逻辑尺)
L0:	MOV AX,[X+SI]
	SHL BX,1
	JNC L1
	ADD AX,[SI+Y]
	JMP L2
L1:	SUB AX,[SI+Y]
L2:	MOV [SI+Z],AX
	ADD SI,2
	LOOP L0
	HLT

ASCⅡ,BCD,进制转换等都和移位程序有关

原题:
在这里插入图片描述

【6】基础程序:从键盘输入一个十六进制数并转换为数值

AGAIN:	MOV AH,1
	INT 21H
	CMP AL,'0'
	JB AGAIN
	CMP AL,'9'
	JBE BT0
	CMP AL,'A'
	JB AGAIN
	CMP AL,'F'		;只判断了大写字母
	JBE BT1
	JMP AGAIN
BT0:	SUB AL,30H
	JMP OK
BT1:	SUB AL,37H
OK:	HLT

【7】该程序没用过,但感觉很神奇

试按输入的ASCⅡ字符命令(A-F),转向相应的处理程序。命令字符的处理程序入口地址顺序存放于表TAB中,设查表之前输入的命令字符在AL中。

START:	LEA BX,TAB
	SUB AL,41H
	SHL AL,1		;(短转移*2)
	MOV AH,0
	ADD BX,AX
	JMP BX
TAB:	JMP A1
	JMP B1
	...
	JMP F1
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
混合编程是指在同一个程序中,同时使用C语言和汇编语言进行编程。常见的混合编程方式有两种: 1. 内嵌汇编:将汇编语言嵌入到C语言程序中,使用asm关键字来标识内嵌汇编代码。内嵌汇编代码可以直接访问CPU的寄存器和内存,可以实现一些高效的操作。例如: ```c int main() { int a = 10, b = 20, c; __asm__("movl %1, %%eax;\n\t" "movl %2, %%ebx;\n\t" "addl %%ebx, %%eax;\n\t" "movl %%eax, %0;\n\t" : "=m"(c) : "r"(a), "r"(b) : "%eax", "%ebx" ); printf("c = %d\n", c); return 0; } ``` 这段代码中,使用了内嵌汇编来实现a+b的加法操作,并将结果存储到变量c中。其中,%0、%1、%2分别表示输出、输入操作数的占位符,%eax和%ebx表示CPU的寄存器,=m表示输出操作数的内存位置,r表示输入操作数可以是寄存器或内存。 2. 汇编函数:将汇编语言编写成函数形式,在C语言程序中调用汇编函数。汇编函数需要使用汇编指令来实现具体的功能,并将结果返回给C语言程序。例如: ```c int my_add(int a, int b); int main() { int a = 10, b = 20, c; c = my_add(a, b); printf("c = %d\n", c); return 0; } ``` ```asm ; 汇编函数my_add的实现 global my_add my_add: mov eax, [ebp+8] ; 取参数a add eax, [ebp+12] ; 加上参数b mov [ebp-4], eax ; 将结果存储到局部变量中 mov eax, [ebp-4] ; 返回结果 ret ``` 这段代码中,使用汇编函数my_add来实现a+b的加法操作,并将结果返回给C语言程序。在汇编函数中,使用了ebp寄存器来访问函数参数和局部变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值