用汇编语言编一个加法程序

用汇编语言编一个加法程序,第1张

输入格式必须为A+或-或/或哗汪瞎*B=

按回车结束运算数为(乱空0~255)

DATAS SEGMENT

x db 20 dup(?)

y db 'chu cuo le','$'

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

JMP A

KAISHI:

回车换行

MOV DL,0DH

MOV AH,02H

INT 21H

MOV DL,0AH

INT 21H

LEA SI,X

SUB AX,AX

SUB BX,BX

SUB CX,CX

SUB DX,DX

输入数字

A: MOV AH,01H

INT 21H

CMP AL,0DH

JZ L

CMP AL,30H

JB B

CMP AL,3AH

JNB F

SUB AL,30H

MOV CH,AL

MOV AL,BL

MOV BL,0AH

MUL BL

ADD AL,CH

MOV BL,AL

JMP A

判陵租断+-*/=

B: CMP AL,2BH

JNZ K

MOV X[SI],BL

INC SI

MOV CL,0H

AND BL,0

JMP A

K: CMP AL,2DH

JNZ D

MOV X[SI],BL

INC SI

MOV CL,01H

AND BL,0

JMP A

D: CMP AL,2AH

JNZ E

MOV X[SI],BL

INC SI

MOV CL,02H

AND BL,0

JMP A

E: CMP AL,2FH

JNZ T

MOV X[SI],BL

INC SI

MOV CL,03H

AND BL,0

JMP A

计算

F: MOV [SI],BL

CMP AL,3DH

JNZ T

LEA SI,X

MOV AL,X[SI]

INC SI

MOV BL,X[SI]

CMP CL,0

JNZ G

ADD AL,BL

JMP J

G: CMP CL,01H

JNZ H

SUB AL,BL

JMP J

H: CMP CL,02H

JNZ I

AND AH,0

MUL BL

JMP J

I: AND AH,0

CMP CL,03H

DIV BL

输出

J: AND AH,0

CMP AL,100

JB ER

MOV BL,100

DIV BL

MOV CL,AH

ADD AL,30H

MOV DL,AL

MOV AH,02H

INT 21H

MOV AL,CL

ER: CMP AL,10

JB YI

MOV BL,10

AND AH,0

DIV BL

ADD AL,30H

MOV DL,AL

MOV CL,AH

MOV AH,02H

INT 21H

MOV AL,CL

YI: ADD AL,30H

MOV DL,AL

MOV AH,02H

INT 21H

JMP KAISHI

T: LEA DX,Y

MOV AH,09H

INT 21H

JMP KAISHI

L: MOV AH,4CH

INT 21H

CODES ENDS

END START

经验证,下式结果正确

S=86H*34H-22H=1B38H-22H=1B16H

code segment

assume cs:code,ds:code

org 100h COM格式

start:

push cs

pop ds

mov ax,0e53h 显示'S'

int 10h

mov al,'='显示'='

int 10h

call @IN

mov dl,al

mov bl,2ah"*"

call show 显示'H*'

call @IN

mov dh,al

mov bl,2dh "-"

call show 显示'H-'

call @IN

mov ah,0

mov bp,ax

mov bl,3dh "="

call show 显示'H='

mov ah,0

mov al,dl AL←86H

mov bl,dh BL←34H

mul bl 86H*34H

未考虑不够减的情况

sub ax,bp AX←AX-22H

mov cx,4

mov dx,ax

next:

push cx

mov cl,4

rol dx,cl

mov ax,dx

and al,0fh 取出一位

or al,30h 二进制转换为Ascii

cmp al,'9'比9小直接显示

jb T2

add al,7 是A`F的,加7校正

T2:

mov ah,0eh 显示Ascii

int 10h

pop cx

loop next 下一位

mov ax,0e48h 'H'

int 10h

mov ah,0

int 16h 暂停

mov ah,4ch

int 21h 结则肢束

@IN:可输入两位十六进制数

xor bx,bx BX←0

mov cx,4

@1:call input

mov bl,al

shl bl,cl BL←BL*10H

call input

add al,bl AL←两位十六进制数

ret

input: 仅允许输入并显示0-9和A-F

mov ah,0

int 16h 无回显键盘输入

cmp al,'0'十六进制数 0-F

jb input 为拆铅有效输入旅盯好

cmp al,'9'

jbe Q1

and al,0dfh 大小写,同转为大写

cmp al,'A'"A(a)"

jb input

cmp al,'F'"F(f)"

ja input

Q1:mov ah,0eh

int 10h 显示有效输入

sub al,30h 0-9之间,Ascii转换为二进制

cmp al,9

jbe Q3

sub al,7

Q3:ret

show:

mov ax,0e48h "H"

int 10h

mov al,bl

int 10h

ret

code ends

end start

楼主,你用是什么的汇编啊。是8088/8086,还是单片机的,是什么公司的升察产品,什么型号的,它们都是有一些差异的。

我在这就说一下思路吧。用汇编做加减法比较容易,带进位不带进位的都可以,做乘除是隐液比较难的,一般是不用它做的,必须时灶笑物也最好转换成加减,这样在实现的时候才会方便。

我再说点MC51的汇编语言,也许你能用上。(都是一些语法)

带进位加法:addc a,#data (a)+#data+(c)-->(a)

addc a,data (a)+(data)+(c)-->(a)

addc a,@r(a)+((r))+(c)-->(a)

带进位的减法:subb a,#data

subb a,data

subb a,@r1

乘法:mul a b(a)*(b)

除法:div a b(a)/(b)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12337786.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存