汇编语言,两数相乘或相加帮忙解释

作者&投稿:初睿 (若有异议请与网页底部的电邮联系)
简单汇编语言(两数相加)~

补充回答:没有注意那两个数的大小已经超出16位寄存器所能容纳的范围,应该用双字定义、双字相加。已经修改。非常抱歉。

Data segment
d1 DD 99251
Data Ends

Extra segment
d2 DD -15962
d3 DD ?
Extra Ends

Code segment
assume cs:Code,ds:Data,es:Extra

start: mov ax,Data
mov ds,ax
mov ax,Extra
mov es,ax
mov ax,word ptr d1
add ax,word ptr es:d2
mov dx,word ptr d1[2]
adc dx,word ptr es:d2[2]
mov word ptr es:d3,ax
mov word ptr es:d3[2],dx

mov ax,4c00h
int 21h

Code Ends
end start

补充回答:没有注意那两个数的大小已经超出16位寄存器所能容纳的范围,应该用双字定义、双字相加。已经修改。非常抱歉。

Data segment
d1 DD 99251
Data Ends

Extra segment
d2 DD -15962
d3 DD ?
Extra Ends

Code segment
assume cs:Code,ds:Data,es:Extra

start: mov ax,Data
mov ds,ax
mov ax,Extra
mov es,ax
mov ax,word ptr d1
add ax,word ptr es:d2
mov dx,word ptr d1[2]
adc dx,word ptr es:d2[2]
mov word ptr es:d3,ax
mov word ptr es:d3[2],dx

mov ax,4c00h
int 21h

Code Ends
end start

;这够详细了
;如果哪里不懂,你指出来吧!
;=======================================================
;CRLF宏定义
;功能:回车换行
CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATA SEGMENT
DATA1 DB 5 DUP(0)
DATA2 DB 5 DUP(0)
RESULT DB 6 DUP(?)

DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DB 20 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX ;初始化数据段寄存器
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX ;这个紧随MOV SS,AX较妥当,所以MOV SP,TOP就好,SP又不是段寄存器

MOV SI,OFFSET DATA2
MOV BX,05
CALL INKEY ;输入DATA2,之所以先输入DATA2,是为了在ADDA之前少一个MOV SI,OFFSET DATA1
CRLF ;宏调用换行,下同
MOV SI,OFFSET DATA1
MOV BX,05
CALL INKEY
CRLF
MOV DI,OFFSET DATA2
CALL ADDA ;加法
MOV SI,OFFSET DATA1
MOV BX,06
CALL DISPL ;显示输出
CRLF
MOV AX,4C00H
INT 21H
;DISPL子程序定义
;功能:打印字符串
;参数:SI=字符串首地址
; BX=字符串长度
;返回:NONE
DISPL PROC NEAR
DS1: MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
;INKEY子程序定义
;功能:输入字符串
;参数:SI=字符串首地址
; BX=字符串长度
;返回:NONE
INKEY PROC NEAR
IN1: MOV AH,01
INT 21H
MOV [SI+BX-1],AL
DEC BX
JNZ IN1
RET
INKEY ENDP
;INKEY子程序定义
;功能:多位加法
;参数:SI=目标字符串首地址
; SI=目标字符串首地址
; BX=字符串长度
;返回:NONE
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1: SUB BYTE PTR [SI+BX-1],30H
SUB BYTE PTR [DI+BX-1],30H
DEC BX
JNZ AD1 ;转换字串为数字
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ;带进位加法
AAA ;非压缩BCD加法调整
MOV [SI],AL ;保存结果
INC SI
INC DI
LOOP AD2
;------------------------------
MOV AL,00H
ADC AL,00H
MOV [SI],AL
;------------------------------
;处理最高位
;就是[SI]+CF->[SI]
;我可能会这么写
;JNC YC
;INC BYTE PTR [SI]
;YC:
MOV SI,DX
MOV DI,BP
MOV BX,06

AD3: ADD BYTE PTR [SI+BX-1],30H
ADD BYTE PTR [DI+BX-1],30H
DEC BX
JNZ AD3 ;转换数为字串
RET
ADDA ENDP
CODE ENDS
END START

;这够详细了
;如果哪里不懂,你指出来吧!
;=======================================================
;CRLF宏定义
;功能:回车换行
CRLF
MACRO
MOV
DL,0DH
MOV
AH,02H
INT
21H
MOV
DL,0AH
MOV
AH,02H
INT
21H
ENDM
DATA
SEGMENT
DATA1
DB
5
DUP(0)
DATA2
DB
5
DUP(0)
RESULT
DB
6
DUP(?)
DATA
ENDS
STACK
SEGMENT
PARA
STACK
'STACK'
STA
DB
20
DUP(?)
TOP
EQU
LENGTH
STA
STACK
ENDS
CODE
SEGMENT
ASSUME
CS:CODE,DS:DATA,SS:STACK
START:
MOV
AX,DATA
MOV
DS,AX
;初始化数据段寄存器
MOV
AX,STACK
MOV
SS,AX
MOV
AX,TOP
MOV
SP,AX
;这个紧随MOV
SS,AX较妥当,所以MOV
SP,TOP就好,SP又不是段寄存器
MOV
SI,OFFSET
DATA2
MOV
BX,05
CALL
INKEY
;输入DATA2,之所以先输入DATA2,是为了在ADDA之前少一个MOV
SI,OFFSET
DATA1
CRLF
;宏调用换行,下同
MOV
SI,OFFSET
DATA1
MOV
BX,05
CALL
INKEY
CRLF
MOV
DI,OFFSET
DATA2
CALL
ADDA
;加法
MOV
SI,OFFSET
DATA1
MOV
BX,06
CALL
DISPL
;显示输出
CRLF
MOV
AX,4C00H
INT
21H
;DISPL子程序定义
;功能:打印字符串
;参数:SI=字符串首地址
;
BX=字符串长度
;返回:NONE
DISPL
PROC
NEAR
DS1:
MOV
AH,02
MOV
DL,[SI+BX-1]
INT
21H
DEC
BX
JNZ
DS1
RET
DISPL
ENDP
;INKEY子程序定义
;功能:输入字符串
;参数:SI=字符串首地址
;
BX=字符串长度
;返回:NONE
INKEY
PROC
NEAR
IN1:
MOV
AH,01
INT
21H
MOV
[SI+BX-1],AL
DEC
BX
JNZ
IN1
RET
INKEY
ENDP
;INKEY子程序定义
;功能:多位加法
;参数:SI=目标字符串首地址
;
SI=目标字符串首地址
;
BX=字符串长度
;返回:NONE
ADDA
PROC
NEAR
MOV
DX,SI
MOV
BP,DI
MOV
BX,05
AD1:
SUB
BYTE
PTR
[SI+BX-1],30H
SUB
BYTE
PTR
[DI+BX-1],30H
DEC
BX
JNZ
AD1
;转换字串为数字
MOV
SI,DX
MOV
DI,BP
MOV
CX,05
CLC
AD2:
MOV
AL,[SI]
MOV
BL,[DI]
ADC
AL,BL
;带进位加法
AAA
;非压缩BCD加法调整
MOV
[SI],AL
;保存结果
INC
SI
INC
DI
LOOP
AD2
;------------------------------
MOV
AL,00H
ADC
AL,00H
MOV
[SI],AL
;------------------------------
;处理最高位
;就是[SI]+CF->[SI]
;我可能会这么写
;JNC
YC
;INC
BYTE
PTR
[SI]
;YC:
MOV
SI,DX
MOV
DI,BP
MOV
BX,06
AD3:
ADD
BYTE
PTR
[SI+BX-1],30H
ADD
BYTE
PTR
[DI+BX-1],30H
DEC
BX
JNZ
AD3
;转换数为字串
RET
ADDA
ENDP
CODE
ENDS
END
START


C语言 输入两个数据 将这两个数据相乘 并将结果输出 初学者
include <stdio.h> int main(){ int a ;int b ;printf("请输入两个数:");scanf("%d %d",&a,&b);int c = a * b;printf("%d",c);return 0;}

汇编语言 键盘输入两个数相乘
输入第二个字符 sub AL,30H mul BL ;(AL)*(BL)--->(AX) mov AH,2 ;显示乘积 mov DX,AX ;出口参数必须是DL或者DX int 21H mov ah,4ch int 21hcode ends end start这个程序我没有在电脑上运行,你剪切下来再电脑上试一下看是不是正确...

C语言编程:从键盘输入两个实数后,屏幕显示菜单如下内容?
                 "两数相乘之商"};int main(void){     double n1, n2, result;    int ...

c语言。编一个运算器程序。要求能实现两个数的加减乘除四种运算。输入...
,a,b,c);break;case '\/':switch(b==0){ case 1:printf("输入有误,请重试:"); break;case 0:c=a\/b;printf("%f\/%f=%f\\n",a,b,c);break;}break;default:printf("输入表达式错误或该计算器不具备 %ch 功能\\n",ch);} } 这个程序试过了,完全能用,请给个满分哦 ...

两个二维数组行相乘的c语言编程是什么?
printf("矩阵A*矩阵B为:\\n"); \/\/计算两个矩阵相乘;以[2][2]*[2][1]为例 for(p=0;p<2;++p) 首先要对编程有个比较大概的了解,编程的对象,编程的原理,编程的目的等等。推荐阅读《计算机科学导论》,该书简单明了的讲述了计算机组成、计算机网络、操作系统、程序设计、数据结构等编程均会用到的基本知识...

python中常用的运算符
①+ 名称:加 可用于对数字,序列等数据操作 。对于数字进行求和;其他的是连接 ②- 名称 :减 只是求差 ③* 名称:乘法 可用于数字、序列等数据进行操作;数字是求积;其他类型进行连续性的操作 ④\/ 名称:除法 求商 ⑤% 名称:取余 求两个数字除法运算的余数 ⑥** 名称:...

用C语言编了一个两个大数相乘求结果的程序,但是在VC++6.0上编译不了...
把main函数里的i定义在main函数开始就行了,或者把T1.c改名为T1.cpp

如何用C语言程序设计计算出2的64次方,或者计算出两个大数相乘(每个数都...
include<stdio.h> int lenth=0; \/\/lenth为数组内数据的位数。void cheng(char *num){ int i;for(i=0;i<lenth;i++) \/\/从最低为开始判断数组内的数字,非0则*2,分步乘。{ num*=2;} for(i=0;i<lenth;i++) \/\/如果低位〉10则向前进位 if(num>9){ num-=10;num[i+...

求一C语言编程:求两个大数的乘积。
for(k=i-1;k>=0;k--) \/\/数组1的每位数分别乘数组2 { h=0;for(l=j-1,m=0;l>=0;m++) \/\/ { f=100-(i-1-k)-m;t=c[k][f]=h+a1[k]*b1[l--];c[k][f]=t%10;h=t\/10;} if(t>=10) c[k][f]=h;} for(h=100;h>0;h--) d[h]=c[0][h];...

汇编语言两数相乘
执行乘法指令(MUL)后,调整存放在AL寄存器中的乘积:(AH)←(AL)\/ 0AH的商 (AL)←(AL)\/ 0AH的余数 AAM实际上是将两个一位数的非压缩BCD码相乘后得到的乘积进行二化十的转换,十位数放在AH中,个位数放在AL中,那么AX中就是乘积的非压缩BCD码。注意:如果是两个ASCII码数相乘,要先将...

钟祥市15993953657: 汇编语言,两数相乘或相加帮忙解释
大季乳强力: ;这够详细了 ;如果哪里不懂,你指出来吧! ;======================================================= ;CRLF宏定义 ;功能:回车换行 CRLF MACRO MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H ...

钟祥市15993953657: 简单汇编语言(两数相加) -
大季乳强力: 补充回答:没有注意那两个数的大小已经超出16位寄存器所能容纳的范围,应该用双字定义、双字相加.已经修改.非常抱歉. Data segment d1 DD 99251 Data Ends Extra segment d2 DD -15962 d3 DD ? Extra Ends Code segment assume ...

钟祥市15993953657: 汇编语言:两个数的加法?
大季乳强力: 单字节加:MOV A,@R0 ;假设R0指向加数,R1指向被加数 ADD A,@R1 ;相加后A中为新值

钟祥市15993953657: 汇编语言实现键盘输入两个数并向加 -
大季乳强力: 说说思路,很简单,我估计你也能想出来 键盘输入两个字符串,这个应该不难,dos中断调用可以搞定,再不麻烦点用BIOS中断调用,再不济也可以直接读取键盘端口. 然后将两个字符串转换成数值,这样相加比较容易,几条指令就可以,如用不转换也可以,这样就很麻烦了. 之后如果想要显示出来的话,再转换成字符串输出,可以用中断调用进行显示,直接写显存也可以显示.

钟祥市15993953657: 汇编语言 键盘输入两个数相乘 -
大季乳强力: code segmentassume cs:code,ds:date start:mov AH,01Hint 21H ;输入第一个字符mov BL,AL;转存sub BL,30H;ASCII码转换mov AH,01Hint 21H ;输入第二个字符sub AL,30Hmul BL ;(AL)*(BL)--->(AX)mov AH,2 ;显示乘积mov DX,...

钟祥市15993953657: 汇编语言中的乘法指令为什么两数位数相同 -
大季乳强力: 两个相乘的数,要么都是8位,要么都是16位.为什么呢?解释如下:按照规定,如果是8位相乘,一个默认存储在AH中,另一个存储在8位寄存器或者内存字节单元中,计算结果默认放在AX中;如果是16位相乘,一个默认存储在AX中,另...

钟祥市15993953657: 汇编语言 1任意两个数相加,减 乘 除;2:1+到n 要详细的过程,自己的想法思路. 急求!拜托 -
大季乳强力:[答案] ;问题未指明硬件,暂用MCS51 ;题目未指明数据大小(格式),暂用8位无符号数 ;待运算数据分别存于40H/41H,结果存于42H,不计进位 ;加法 MOV A, 40H ADD A, 41H MOV 42H, A ;减法 MOV A, 40H SUBB A, 41H MOV 42H, A ;乘法 ...

钟祥市15993953657: 用汇编语言编一个程序!高手帮帮忙! 两个十进制数相加 -
大季乳强力: 先用16进制数相加.最后BCD码转换.这是思路.按键哪里你可以用增1的方法吧.分别 X100 X10 X1 不就可以了么?汇编自己动手吧 别人的东西终究是别人的!

钟祥市15993953657: 汇编语言中的循环次数是如何计算的 就是两个数相乘?如DELAY :MOV R6,#100 DEL1:MOV R5,#20 DEL:DJNZ R5,DEL DJNZ R6,DEL1 RET -
大季乳强力:[答案] 其实掌握了机器周期数就很简单了,分别为1,1,2,2,2 1+2+(1+2*20+2)*100=4303微秒

钟祥市15993953657: 用汇编语言如何实现两个16位二进制数相加 -
大季乳强力: ORG 0030H MAIN:MOV R0,#--MOV R1,#--MOV R2,#--MOV R3,#--CLR CMOV A,R0ADD A,R2MOV R4,AMOV A,R1ADDC A,R3MOV R5,AEND 低8位加后入相加再加上进位放入R5.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网