汇编问题,在线等待~~~

1.完成多字长数的加、减、乘、除运算,要求:
(1)用自然语言描述算法实现过程,并画出流程图;
(2)用汇编语言实现程序。
2.谈谈学习汇编的方法(最好举例说明)。

回答正确分再追加~~~~~
下面三楼的兄弟回答的太长了,能缩短点吗?

这是我自己编过项目中的多字节运算子程序
有加法,除法,减乘更为简单类推一下吧
注释写得很详细了,出口入口地址也有标记

;n个数据相加子程序
;11,13,15为进位。12,14,16为相加结果,分别为低8位、中、高8位
;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
ADDP: MOV 11H,#00H
MOV 12H,#00H
MOV R0,#20H ;<---"20"起始位置
MOV 12H,@R0
LOOP1: MOV A,R0
ADD A,#03H
MOV R1,A
MOV A,12H
ADD A,@R1
JNB PSW.7,SI1
INC 11H
SI1: MOV 12H,A
MOV A,R1
MOV R0,A
CJNE R0,#4DH,LOOP1 ;<---"4D"终止变量,YANG YF DESIGN

MOV A,#00H

MOV 13H,#00H
MOV 14H,#00H
MOV R0,#21H ;<---"21"起始位置
MOV 14H,@R0

MOV A,14H
ADD A,11H
MOV 14H,A

LOOP2: MOV A,R0
ADD A,#03H
MOV R1,A
MOV A,14H
ADD A,@R1
JNB PSW.7,SI2
INC 13H
SI2: MOV 14H,A
MOV A,R1
MOV R0,A
CJNE R0,#4EH,LOOP2 ;<---"4E"终止变量

MOV A,#00H

MOV 15H,#00H
MOV 16H,#00H
MOV R0,#22H ;<---"22"起始位置
MOV 15H,@R0

MOV A,16H
ADD A,13H
MOV 16H,A

LOOP3: MOV A,R0
ADD A,#03H
MOV R1,A
MOV A,16H
ADD A,@R1
JNB PSW.7,SI3
INC 15H
SI3: MOV 16H,A
MOV A,R1
MOV R0,A
CJNE R0,#4FH,LOOP3 ;<---"4F"终止自定义位置变量 ,

MOV A,#00H
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

;除法运算子程序
;支持被除数32位、除数24位,任意位长除法
;被除数需根据计时和累加组数****预先置入,****调试准确度调整亦调节此值!!!!!!!!
;17H、18H、19H为除数输入口,32H、33H、34H、35H为运算结果
;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
SETDIV: MOV P1,#0FFH
JNB P1.1,MEAS_F ;当P1.1置1(高)为测速,置0(低)为测频

MEAS_V: MOV R2,#11111111B ;***测速****
MOV R3,#11101000B ;被除数R2-R5,转移至22H-25H进行变位处理
MOV R4,#00100101B ;**被除数为定值,前端0的个数已知
MOV R5,#00001011B ;设被除数前端0的个数已知为y,除数前端0的个数计数为x(R0),后部循环次数为(32-y)-(24-x)=(8-y)+x

JMP STARDIV

MEAS_F: MOV R2,#00111010B ;***测频**** YANG YF DESIGN
MOV R3,#01100110B ;被除数R2-R5,转移至22H-25H进行变位处理
MOV R4,#00111110B ;**被除数为定值,前端0的个数已知
MOV R5,#10000111B ;设被除数前端0的个数已知为y,除数前端0的个数计数为x(R0),后部循环次数为(32-y)-(24-x)=(8-y)+x

JMP STARDIV

STARDIV: MOV 22H,R2
MOV 23H,R3
MOV 24H,R4
MOV 25H,R5

MOV 17H,16H ;除数17H-19H,载入累加后12H、14H、16H结果
MOV 18H,14H
MOV 19H,12H

MOV 32H,#00H ;结果输出位32H-35H初置0 YANG YF DESIGN
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H

MOV R0,#00H
MOV R1,#00H
MOV 10H,#00H

CHECKFRONT: CLR C
MOV A,17H ;检查除数高位是否有空位0
RLC A
JNC MOVFRONT
JMP LOOPCOUNT

MOVFRONT: INC R0
CLR C ;除数高位空位为0时前移
MOV A,19H ;1)
RLC A
MOV 19H,A
MOV A,18H ;2)
RLC A
MOV 18H,A
MOV A,17H ;3)
RLC A
MOV 17H,A
JMP CHECKFRONT

LOOPCOUNT: MOV A,#09H ;
ADD A,R0
MOV 10H,A ;后部循环次数R0

JUDGSUB: MOV PSW,#00H
MOV A,R1
CJNE A,10H,JMP0
JMP RESULTDIV

JMP0: MOV A,22H
MOV C,ACC.7 ;******!!!!
MOV F0,C
CLR C ;******!!!!
SUBB A,17H
JC CANOTSUB ;溢位
JNZ JMP1 ;WHEN ACC!=#00H THEN JUMP
MOV A,23H
CLR C
SUBB A,18H
JC CANOTSUB
JMP1: JNZ JMP2 ;WHEN ACC!=#00H THEN JUMP
MOV A,24H
CLR C
SUBB A,19H
JC CANOTSUB
JMP2: JMP SUBBPART

CANOTSUB: JNB F0,TURN1
JB F0,MOVDR
JMP SUBBPART

SUBBPART: CLR C
MOV A,25H
JNB PSW.1,JMPSP1
JB ACC.7,JMPSP1
SETB ACC.7
MOV A,19H
INC A
MOV 19H,A
JMPSP1: MOV A,24H
SUBB A,19H
MOV 24H,A
MOV A,23H
SUBB A,18H
MOV 23H,A
MOV A,22H
SUBB A,17H
MOV 22H,A

ACALL SETCY_1
JB B.0,MOVDL ;除数因条件右移后左移恢复

LJMP JUDGSUB

MOVDR: SETB B.0
CLR C ;除数右移一位
MOV A,17H ;1)
RRC A
MOV 17H,A
MOV A,18H ;2)
RRC A
MOV 18H,A
MOV A,19H ;3)
RRC A
MOV 19H,A
MOV PSW.1,C ;除数末尾移出暂存至F1
ACALL SETCY_0
JMP SUBBPART

MOVDL: MOV C,PSW.1
MOV A,19H ;1)
RLC A
MOV 19H,A
MOV A,18H ;2)
RLC A
MOV 18H,A
MOV A,17H ;3)
RLC A
MOV 17H,A
CLR B.0
SETB B.1
JMP JUDGSUB

TURN1: CLR C
MOV A,25H ;1)
RLC A
MOV 25H,A
MOV A,24H ;2)
RLC A
MOV 24H,A
MOV A,23H ;3)
RLC A
MOV 23H,A
MOV A,22H ;4)
RLC A
MOV 22H,A
JB B.1,JMPCALLSC0
ACALL SETCY_0
JMPCALLSC0: CLR B.1
JMP JUDGSUB

SETCY_0: JB B.2,JMPSE1 ;B.2判断是否置1后第一次置0,是则忽略一次
INC R1 ;已计算次数计数
CLR C ;移入一位0
MOV A,35H
RLC A
MOV 35H,A ;输出地址32H-35H
MOV A,34H
RLC A
MOV 34H,A
MOV A,33H
RLC A
MOV 33H,A
MOV A,32H
RLC A
MOV 32H,A
CLR C
JMPSE1: CLR B.2
RET

SETCY_1: INC R1 ;已计算次数计数 YANG YF DESIGN
SETB C ;移入一位1
MOV A,35H
RLC A
MOV 35H,A ;输出地址32H-35H
MOV A,34H
RLC A
MOV 34H,A
MOV A,33H
RLC A
MOV 33H,A
MOV A,32H
RLC A
MOV 32H,A
CLR C
SETB B.2
RET

RESULTDIV: ;不可删 YANG YF DESIGN

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-25
好麻烦....俺比较懒...
第2个回答  2008-03-25
没玩过汇编
你去一些源代码的网站上上找找
估计会有
第3个回答  2008-03-25
B_P EQU BYTE PTR
W_P EQU WORD PTR
D_P EQU DWORD PTR
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
;主程序开始
NEWSTAR:
JMP STAR
EVEN
NUM1 DW 0,0
NUM2 DW 0,0
NUM3 DW 0,0
JGV4 DW 0,0
YSF LABEL WORD
YSF1 DB 0
YSF2 DB 0
JUV DB 0
UV DB 0
;使DS:SI指向第一有效字符
OVERS LABEL NEAR
CLD
PUSH AX
OVERS1:
LODSB
CMP AL,' '
JZ OVERS1
CMP AL,9
JZ OVERS1
DEC SI
CMP AL,13
POP AX
RET
;输出一个制表符
TAB LABEL NEAR
MOV AL,9
JMP SHORT DISP
;输出一个回车换行符
CRLF LABEL NEAR
MOV AL,13
CALL DISP
MOV AL,10
;显示一个字符
DISP LABEL NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,AL
INT 21H
POP DX
POP AX
RET
;检查是否为运算符
ISYSF LABEL NEAR
CLD
LODSB
CALL ISJJ
JZ ISYSF1
CALL ISII
JZ ISYSF1
DEC SI
ISYSF1:
RET
;检查是否是加减运算
ISJJ LABEL NEAR
CMP AL,'+'
JZ ISYSF1
CMP AL,'-'
RET
;检查是否为乘除运算
ISII LABEL NEAR
CMP AL,'*'
JZ ISYSF1
CMP AL,'/'
JZ ISYSF1
CMP AL,'\'
RET
;数据输出
;CX=10 十进制
;CX=16 十六进制
DOUT LABEL NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH BP
XOR BP,BP
DOUT1:
INC BP
PUSH AX
MOV AX,DX
XOR DX,DX
DIV CX
MOV BX,AX
POP AX
DIV CX
PUSH DX
MOV DX,BX
OR BX,AX
JNZ DOUT1
DOUT2:
POP AX
ADD AL,'0'
CMP AL,'9'
JBE DOUT3
ADD AL,'A'-'9'-1
DOUT3:
CALL DISP
DEC BP
JNZ DOUT2
POP BP
POP DX
POP BX
POP AX
RET
;输入数据在DX:AX中返回
;CX=0 数据为10进制
;CX#0 数据为16进制
DATE LABEL NEAR
PUSH BX
PUSH BP
PUSH DI
XOR AX,AX
XOR DX,DX
DATE1:
MOV DI,AX
LODSB
CMP AL,'0'
JB DATE7
CMP AL,'9'
JA DATE6
DATE2:
AND AX,0FH
SHL DI,1
RCL DX,1
MOV BX,DI
MOV BP,DX
SHL DI,1
RCL DX,1
SHL DI,1
RCL DX,1
JCXZ DATE3
SHL DI,1
RCL DX,1
Jmp short DATE4
DATE3:
ADD DI,BX
ADC DX,BP
DATE4:
ADD AX,DI
ADC DX,0
JMP DATE1
DATE5:
ADD AL,9
JMP DATE2
DATE6:
JCXZ DATE7
CMP AL,'A'
JB DATE7
CMP AL,'F'
JBE DATE5
CMP AL,'a'
JB DATE7
CMP AL,'f'
JBE DATE5
DATE7:
MOV AX,DI
DEC SI
OR DI,DX
POP DI
POP BP
POP BX
RET
;数据1与数据2根据YSF1进行加减运算
JSJJ LABEL NEAR
MOV AX,NUM2
MOV DX,NUM2+2
CMP YSF1,'+'
JZ JSJJ1
SUB NUM1,AX
SBB NUM1+2,DX
JMP SHORT JSJJ2
JSJJ1:
ADD NUM1,AX
ADC NUM1+2,DX
JSJJ2:
RET
;数据1与数据2根据YSF1进行乘除运算
JSII1 LABEL NEAR
MOV BX,OFFSET NUM1
JMP SHORT JSII2_1
;数据2与数据3根据YSF2进行乘除运算
JSII2 LABEL NEAR
MOV BX,OFFSET NUM2
JSII2_1:
DB 66H
MOV AX,[BX]
DB 66H
MOV CX,[BX+4]
CMP YSF2,'*'
JNZ JSII2_2
DB 66H
IMUL CX
JMP SHORT JSII2_3
JSII2_2:
DB 66H
CWD
DB 66H
IDIV CX
CMP YSF2,'/'
JZ JSII2_3
DB 66H
XCHG DX,AX
JSII2_3:
DB 66H
MOV [BX],AX
RET
;显示结果
XUJG LABEL NEAR
MOV AX,JGV4
MOV DX,JGV4+2
MOV CX,10
CMP UV,10
JZ XUJG0
MOV CX,16
XUJG0:
TEST DX,8000H
JZ XUJG1
CMP UV,10
JZ XUJG2
CALL DOUT
XUJG2:
NOT AX
NOT DX
ADD AX,1
ADC DX,0
PUSH AX
CMP UV,10
JZ XUJG3
MOV AL,' '
CALL DISP
MOV AL,'('
CALL DISP
XUJG3:
MOV AL,'-'
CALL DISP
POP AX
CMP UV,10
JZ XUJG1
CALL DOUT
MOV AL,')'
CALL DISP
RET
XUJG1:
CALL DOUT
RET
;计算结果放入DX:AX中
JSJG LABEL NEAR
CALL JSJJ
MOV AX,NUM1
MOV DX,NUM1+2
RET
;从DS:SI处取一个数据
LOADATE LABEL NEAR
LODSB
CMP AL,'('
JZ LOADATE1
DEC SI
PUSH CX
XOR CX,CX
CMP UV,10
JZ LOADATE0
INC CX ;取16进制数
LOADATE0:
CALL DATE ;取数据放入DX:AX中
POP CX
RET
LOADATE1:
PUSH NUM1 ;保存数据1数据2及运算符
PUSH NUM1+2
PUSH NUM2
PUSH NUM2+2
PUSH YSF
INC JUV
MOV JGV4,0 ;结果值清零
MOV JGV4+2,0
;进行四则运算
SZYS LABEL NEAR
CALL ISYSF ;首字符是运算符?
JZ SZYS2
CALL LOADATE ;不是,取数并保存
MOV NUM1,AX
MOV NUM1+2,DX
SZYS1:
XOR AX,AX ;数据2清零
MOV NUM2,AX
MOV NUM2+2,AX
CALL ISYSF ;下个是运算符?
JZ SZYS3
JNZ SZYS6
SZYS2:
PUSH AX
MOV AX,JGV4 ;将结果作为数据1
MOV NUM1,AX
MOV AX,JGV4+2
MOV NUM1+2,AX
POP AX
SZYS3:
MOV YSF1,AL
MOV YSF2,AL
CALL ISJJ ;是加减运算转
JZ SZYS4
CALL LOADATE ;取数据2
MOV NUM2,AX
MOV NUM2+2,DX
CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算
JMP SZYS1 ; 结果保存在数据1中
SZYS4:
CALL LOADATE ;取数据2并保存
MOV NUM2,AX
MOV NUM2+2,DX
SZYS4_1:
CALL ISYSF
JNZ SZYS6
CALL ISJJ ;运算符2是加减运算?
JNZ SZYS5 ;不是转
PUSH AX
CALL JSJJ ;数据1与数据2根据YSF1进行加减运算
POP AX ; 结果保存在数据1中
MOV YSF1,AL ;保存新的运算符
JMP SZYS4
SZYS5:
MOV YSF2,AL ;保存运算符2
CALL LOADATE ;取数据3
MOV NUM3,AX
MOV NUM3+2,DX
CALL JSII2 ;数据2与数据3根据YSF2进行乘除运算
JMP SZYS4_1 ; 结果保存在数据2中
SZYS6:
MOV CL,AL
CMP AL,13
JNZ SZYS9
SZYS7:
CALL JSJG
CMP JUV,0
JZ SZYS8
DEC JUV
POP YSF
POP NUM2+2
POP NUM2
POP NUM1+2
POP NUM1
RET
SZYS8:
CMP CL,')'
JZ SZYS10
MOV JGV4,AX
MOV JGV4+2,DX
JNZ SZYS12
SZYS9:
CMP AL,')'
JNZ SZYS11
INC SI
JMP SZYS7
SZYS10:
MOV NUM1,AX
MOV NUM1+2,DX
JMP SZYS1
SZYS11:
STC
RET
SZYS12:
CLC
RET
;数制处理
UVIL LABEL NEAR
PUSH SI
UVIL1:
LODSB
CMP AL,' '
JZ UVIL2
CMP AL,9
JZ UVIL2
CMP AL,13
JZ UVIL4
JNZ UVIL1
UVIL2:
MOV BX,SI
CALL OVERS
JZ UVIL3
LODSW
CALL OVERS
POP SI
JNZ SZYS11
CMP AX,'01'
JNZ SZYS11
PUSH SI
MOV UV,10
UVIL3:
MOV AL,13
MOV [BX-1],AL
UVIL4:
POP SI
CLC
RET
;预置结果
YVJG LABEL NEAR
MOV AH,52H
INT 21H
MOV AX,ES:[BX-2]
MOV DS,AX
MOV AX,DS:[0CH]
MOV CS:JGV4,AX
MOV AX,DS:[0EH]
MOV CS:JGV4+2,AX
PUSH CS
POP DS
PUSH CS
POP ES
RET
;保存结果
BCJG LABEL NEAR
MOV AH,52H
INT 21H
MOV AX,ES:[BX-2]
MOV DS,AX
MOV AX,CS:JGV4
MOV DS:[0CH],AX
MOV AX,CS:JGV4+2
MOV DS:[0EH],AX
PUSH CS
POP DS
PUSH CS
POP ES
RET
STAR:
MOV SI,81H
CLD
CALL OVERS
JNZ STAR1
STAR0:
MOV DX,OFFSET MESS1
JMP STAR4
STAR1:
CALL YVJG
CALL UVIL
JB STAR0
MOV SAVESP,SP
CALL SZYS
MOV SP,SAVESP
MOV DX,OFFSET MESS2
JB STAR4
CALL CRLF
CALL XUJG
CALL BCJG
MOV DX,OFFSET MESS3
STAR4:
MOV AH,9
INT 21H
INT 20H
SAVESP DW 0
MESS1 DB 13,10,' Syntax:',13,10
DB ' JS <Expression> [10]',13,10,'$'
MESS2 DB 'Error in expression !$'
MESS3 DB 13,10,'$'
CODE ENDS
END NEWSTAR

学习方法的话,多看书,多练习,多思考
第4个回答  2008-03-25
org 0000h
ljmp main
org 0100h
main:
mov 30h,#0ebh
mov 31h,#93h
mov r0,#30h
mov 40h,#47h
mov 41h,#7dh
mov r1,#40h
mov r2,#3
lcall addp
addp:
clr c
loop:
mov a,@r0
addc a,@r1
mov @r0,a
inc r0
inc r1
djnz r2,loop
end
不知道这个可不可以
第5个回答  2008-03-28
上楼的真是高手!!!!!

汇编题目,求解,在线等
1.某磁盘存储器的转速为5400转\/ 秒,共4个盘面,道密度5道\/ 英寸,每道记录信息为12288字节,最大磁道直径为200mm,共275道,求:(1) 该磁盘存储器的容量?=4*275*12288 (2) 最低位密度?= (3) 平均等待时间?1\/5400\/2=92.5微妙 (4) 请计算3.5英寸软盘的存储容量?2.已知CAC...

汇编问题,在线等待~~~
这是我自己编过项目中的多字节运算子程序 有加法,除法,减乘更为简单类推一下吧 注释写得很详细了,出口入口地址也有标记 ;n个数据相加子程序 ;11,13,15为进位。12,14,16为相加结果,分别为低8位、中、高8位 ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ADDP: MOV 11H,#00H MOV 1...

小学数学题(在线等待中)
问题描述:1.四个人的年龄之和为82岁,其中一个人是22岁,这个人与最大的年龄之和比另外两人年龄之和大12岁,求最大者的年龄.2.有两堆棋子,个数相等,若从第一堆拿96个棋子到第二堆,则第二堆棋子是第一堆的4倍,原来两堆棋子各有多少个?3.商店运拉橘子.苹果.香蕉共53千克,橘子的重量...

汇编语言的延时问题 简单 急
NOP和LJMP START通常是放在中断入口处,一般单片机前100H字节有几个中断入口,有软中断也有硬中断,如果没有用到中断,最好也把中断入口给预留出来,并且用NOP和LJMP START指令填入,这是一种编程技巧,可以防止意外中断产生,照成程序执行混乱,转到START后,可以确保程序从头执行。RET是这个DEL5MS延时子程...

8086汇编语言DIV指令的问题
其实,不用等待。你就编写一个“不会溢出”的除法程序,就可以解决。方法思路如下:左图是 CPU 执行 16 位数除以 8 位数时的操作。在右图中,被除数,是四个字节:1A 2B 3C 4DH,有 32 位数。除数,只有一个字节:BL,仅有 8 位数。这么大的被除数,这么小的除数!直接用除法指令来求商,...

期末暂估重复操作的问题如何处理啊?晕,在线等待……紧急!!
processing 状态。我将该会话释放,它竟然又变成了new状态,不知道是何道理。继续选中6月的会话 进行执行,但是结束后,系统显示为error状态。查看记帐科目,发现已经过帐,但是调整科目的金额 与物资采购科目6月的余额不平。不知道这种情况该如何处理啊?实在是急啊。等待ing……...

高分悬赏!关于汇编语言的一些问题!
第5题有点迷糊...感谢锟鹏展翅为我找出错误,谢谢!现在可能没问题了呵呵...有什么问题的话还请指出 1 assume cs:code, ds:datas datas segment var db 100, 77, 69, 201, 32, 148 answer db 0 datas ends code segment start:mov bx, datas mov ds, bx mov cx, 6 mov bx, offset...

帮检查下汇编程序的错误
存在以下几个问题:1. 在按键的延时去抖动后,没有重新读取按键键值,即:L8: ACALL DELAY CJNE A,#0FFH,SAVE 这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A 2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,...

求解释下边这段51单片机汇编程序存在的问题,为什么我不能得到想要的结果...
是吗?需要考虑发送的时间,考虑硬件移位是否需要锁存控制。另外TAB表没给出 TAB:DB 0xxh,0xxh,0xxh,……【3】整个程序的速度太快,可能你是无法看到变化过程的。因此在每次变化前调用一次延时。编写个1秒左右的延时。在每次DIS前调用一下。或者用定时中断等待一下秒标志。祝你成功!

汇编如何修改esp--高分求解决-解决在追加 200-在线等
如:;触发保护异常 ;保存的内容被其他模块意外修改,恢复时,导致堆栈失衡 ;从这里开始 ;mov esp,1000H ;到这里结束 ;中间可以添加代码,只要保证代码块执行前后,EBP的不变,后面的mov esp,ebp指令就可以恢复ESP ;如果确认问题出在该子程序中,就应该着落在这里了 mov esp,ebp pop ebp ret ...

相似回答