; 本程序在MASMPlus 12集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
Table_Data db 0,1,4,9,16,25,36,49,64,81 ;平方值表
Press_Key db 7,13,10,13,10,'The complated Press any key to exit$'
Start: push cs
pop ds
lea bx,Table_Data ;表地址
mov al,-9 ;自变量初值
xor ah,ah
xor dx,dx ;平方和初值
mov cx,19 ;自变量数
Find_Table: push ax
test al,al
jns $+4 ;不是负数,直接查表
neg al ;负数,求补(绝对值)
xlat ;查表
add dx,ax ;累加平方和
pop ax
inc al ;自变量增1
loop Find_Table
; -9~9的平方和保存在寄存器DX中
; -------------------------------------
Exit_Proc: Output Press_Key ;提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer dw , ;数据缓冲区
Code ENDS
END Start ;编译到此结束
16和7是查表指令时的PC与数据表格之间的字节数
MOV A ,@R0 ;取R0指向的地址中的数据到A
ANL A,#0FH ;高四位清零
ADD A,#16 ;加16
MOVC A, @A+PC ;查表,表的首地址为绝对地址PC+A
MOVC A,@A+PC就需要1个字节啊
查表指令距离表首地址的长度是字节数
用DPTR的汇编程序:
ORG 0100H
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
LCALL SUBRTE
ORG 1000H
SUBRTE: MOV R0,#30H ; ;置地址指针R0初值
MOV R1,#40H ; ;置地址指针R1初值
MOV R2,#4 ; ;置字节数
LOOP: MOV A,@R0 ; ;取16进制数
ANL A,#0FH ; ;屏蔽高4位
MOV DPTR,#TABLE ; ;
MOVC A,@A+DPTR ; ;查表低4位转换为ASCⅡ码
MOV @R1,A ; ;送结果
INC R1 ; ;修改指针
MOV A,@R0 ; ;从新取16进制数
SWAP A ; ;高4位与低4位互换
ANL A,#0FH ; ;取高4位
ADD A,#7
MOVC A,@A+PC ; ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE: DB '012345678'
DB '9ABCDEF'
END
建表太麻烦了,我就把中间用到的关键指令给楼主吧(注:我用的是nasm)
mov al,[十六进制值]
mov bx,表首地址
xlat
这三步即可使得al中的结果为对应十六进制数的ASCII码了。
以上就是关于汇编题:试编写一个程序,用查表的方法求-9~9的平方和。全部的内容,包括:汇编题:试编写一个程序,用查表的方法求-9~9的平方和。、MCS-51单片机查表程序、用汇编语言编写源程序:用查表方法,将一位十六进制数转换成其ASCII码,并储存。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)