汇编语言只用ADD指令实现整数和浮点数的加减乘法

合集下载

plc中add指令用法

plc中add指令用法

plc中add指令用法PLC中的ADD指令用法PLC(可编程逻辑控制器)是一种用于自动化控制系统中的特殊计算机,广泛应用于工业自动化领域。

ADD指令是PLC中一种常见且重要的指令,用于实现数字数据的相加运算。

本文将详细介绍PLC中ADD指令的用法,包括指令格式、参数设置、应用场景等内容。

1. 指令格式在PLC程序中,ADD指令通常以一种特定的格式来进行编写,以实现数字数据的相加运算。

下面是ADD指令的基本格式:ADD source, destination其中,source代表被加数,destination代表加数和结果。

可以是寄存器、变量或常数等。

2. 参数设置在使用ADD指令时,我们需要设置一些参数来确保指令能够正确执行。

下面是一些常见的参数设置:- 数据类型:在PLC中,数据可以分为不同的类型,如整数、浮点数、字节等。

在设置ADD指令时,需要选择适当的数据类型以确保数据的正确性。

- 数据区域:PLC通常将数据存储在不同的数据区域中,如输入寄存器、输出寄存器、数据寄存器等。

在设置ADD指令时,需要指定相应的数据区域。

- 数据地址:每个数据区域都有一个对应的地址。

在设置ADD指令时,需要指定被加数和加数的地址,以便PLC能够正确读取数据。

- 运算结果:ADD指令将两个数据相加后,会将结果存储在一个指定的地址中。

在设置ADD指令时,需要指定结果存储地址。

除了上述参数,还可以根据具体需求设置其他参数,如溢出检测、运算单位等。

3. 应用场景ADD指令在PLC程序中有广泛的应用场景,下面将介绍其中几个常见的应用场景。

- 数字信号累加:在某些情况下,我们需要将多个输入信号进行累加。

比如,一个传感器每隔一段时间向PLC发送一个计数信号,我们可以使用ADD指令将这些计数值累加保存到一个变量或寄存器中,从而实现输入信号的累加计数。

- 物料计量:在一些生产过程中,需要准确计量物料的用量。

使用传感器检测物料流量,将检测到的流量数据与前一次的累加值相加,即可得到当前物料的总用量。

x86汇编程序 加法例子

x86汇编程序 加法例子

x86汇编程序加法例子x86汇编语言是一种低级程序设计语言,用于编写计算机程序的一种机器语言。

在x86汇编语言中,加法是最基本的算术运算之一。

下面将列举10个符合要求的x86汇编程序加法例子,并对每个例子进行详细解释。

1. 例子一:```assemblysection .datanumber1 dd 10number2 dd 20result dd 0section .textglobal _start_start:mov eax, [number1] ; 将number1的值加载到寄存器eax 中add eax, [number2] ; 将number2的值加到eax寄存器中 mov [result], eax ; 将eax寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 4 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序通过使用`mov`和`add`指令来实现加法运算。

首先,将`number1`和`number2`的值加载到寄存器`eax`中,然后使用`add`指令将两个值相加,将结果保存在`eax`中,最后将结果输出到标准输出。

2. 例子二:```assemblysection .datanumber1 db 10number2 db 20result db 0section .textglobal _start_start:mov al, [number1] ; 将number1的值加载到寄存器al中 add al, [number2] ; 将number2的值加到al寄存器中mov [result], al ; 将al寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 1 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序使用的是8位寄存器`al`进行加法运算。

总结add

总结add

总结add
引言
在编程过程中,我们经常需要进行数字相加的操作。

add函数是一个常见的函数,用于实现数字相加功能。

通过对add函数的总结和分析,我们可以更好地理解和应用这个函数。

功能描述
add函数是用于将两个数字相加的函数,它接受两个参数并返回它们的和。

def add(a, b):
return a + b
参数说明
•a: 第一个数字,可以是整数、浮点数或复数。

•b: 第二个数字,可以是整数、浮点数或复数。

返回值
add函数返回参数a和参数b的和。

使用示例
以下是使用add函数的示例:
result = add(3, 5)
print(result) # 输出:8
result = add(1.5, 2.7)
print(result) # 输出:4.2
result = add(2+ 3j, 1+ 2j)
print(result) # 输出:(3+5j)
总结
通过对add函数的总结,我们可以得出以下结论:
1.add函数能够实现简单的数字相加功能,可以处理整数、浮点数和复
数。

2.add函数的参数a和b可以是不同类型的数字,包括整数、浮点数和
复数。

3.add函数返回参数a和参数b的和。

4.使用示例展示了如何使用add函数进行数字相加,并给出了相应的输
出结果。

总的来说,add函数是一个简单但非常实用的函数,在日常的编程工作中经常会用到,它能够帮助我们快速地实现数字相加的功能。

对于更复杂的数学运算,我们可以在add函数的基础上进行扩展。

汇编语言加减除三则运算

汇编语言加减除三则运算

汇编语言三一基地程序设计项目三任务:加减除三则运算。

说明:(1)读取字符串的内容,判断第四个字符是'+'、'-'或'/',然后按照相应的符号进行运算,并把运算结果转换为字符串存放在等号后面,最后把算式显示到屏幕中间,白底蓝字。

(2)注意数字字符的ASCII与数字的对应关系,数字的数值加30H为这个数字的字符所对应的ASCII。

Calculate segmentdb '1. 3/1= 'db '2. 5+3= 'db '3. 9-3= 'db '4. 4+5= 'Calculate ends汇编语言源代码:assume cs:code,ss:stackCalculate segmentdb '1. 3/1= 'db '2. 5+3= 'db '3. 9-3= 'db '4. 4+5= 'Calculate endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,Calculatemov ds,axmov ax,0b800hmov si,0mov cx,4s1: push cxmov al,byte ptr ds:[si+4]mov ah,0sub ax,2Bhmov cx,axjcxz jiasub ax,2mov cx,axjcxz jiansub ax,2mov cx,axjcxz chujia:mov al,byte ptr ds:[si+3]mov ah,0mov dl,byte ptr ds:[si+5]mov dh,0add ax,dxsub ax,60hjmp far ptr shuchujian:mov al,byte ptr ds:[si+3]mov ah,0mov dl,byte ptr ds:[si+5]mov dh,0sub ax,dxjmp far ptr shuchuchu:mov al,byte ptr ds:[si+3]mov ah,0sub ax,30hmov dl,byte ptr ds:[si+5]sub dl,30hdiv dlmov ah,0jmp far ptr shuchu shuchu:mov dl,10add al,30hmov ds:[si+7],aladd ah,30hmov ds:[si+8],ahadd si,16pop cxloop s1mov si,0mov cx,2000qingping:mov ax,0hmov es:[si],axadd si,2loop qingpingmov bx,0mov si,0mov cx,4xianshiy:push cxmov cx,16mov di,0xianshix: mov al,byte ptr ds:[si]mov byte ptr es:[di+840+bx],alinc dimov byte ptr es:[di+840+bx],71hinc diinc siloop xianshixpop cxadd bx,160loop xianshiymov ax,4c00hint 21hcode endsend start运行结果:。

汇编addss指令

汇编addss指令

汇编addss指令
ADDSS 是x86 架构下的SIMD (单指令多数据) 指令,属于SSE (Streaming SIMD Extensions) 指令集的一部分。

它主要用于浮点数计算。

ADDSS 指令执行单精度浮点数(32位)的加法操作。

它操作两个源操作数,并将结果存储在目标操作数中。

指令格式如下:
css
ADDSS xmm1, xmm2/m32
xmm1:目标操作数,一个128 位的XMM 寄存器,用于存储加法结果。

xmm2:第一个源操作数,也是一个128 位的XMM 寄存器。

m32:第二个源操作数,一个32 位的内存地址。

操作:
xmm2 的低32 位与m32 的内容进行加法操作。

结果存储在xmm1 的低32 位中,而xmm1 的高96 位保持不变。

注意:ADDSS 只操作低32 位的单精度浮点数,而忽略其他位。

在实际应用中,这种指令通常用于图形处理、物理模拟、科学计算等需要高速浮点运算的场景。

例如,下面的汇编代码展示了如何使用ADDSS 指令:
assembly
; 假设xmm0 中存储了一个单精度浮点数a
; 假设内存地址[address] 中也存储了一个单精度浮点数b
addss xmm0, [address] ; 将a 和b 相加,结果存储在xmm0 中
需要注意的是,为了充分发挥SSE 指令集的性能,通常需要结合其他指令和数据对齐技术来使用。

同时,现代的处理器和编译器也提供了更高级别的SIMD 指令集,如AVX、AVX2、AVX-512 等,这些指令集提供了更宽的数据路径和更多的操作功能。

用汇编语言编写浮点数相乘

用汇编语言编写浮点数相乘

利用微机8086汇编语言进行编写结果:include io32.inc.datamsg1 byte '请输入第一个数字',13,10,0msg2 byte '请输入第二个数字',13,10,0readbuf1 byte 256 dup(0)readbuf2 byte 256 dup(0)num byte 00h ;记录负号个数.codestart:xor ecx,ecx //被乘数的处理及储存xor ebx,ebxmov eax,offset msg1call dispmsgmov eax,offset readbuf1 ;设置入口参数eaxcall readmsg ;调用输入字符串子程序mov edx,eax ;edx记录字符位数push edx ;字符位数压入堆栈保护--------压入堆栈mov esi,offset readbuf1 ;esi指向readbuf1cmp byte ptr [esi],'-'jz again3again1:cmp byte ptr [esi],'.'jnz again2push ecx ;压入堆栈ecxinc esidec edxagain2:inc ecx ;read2循环字符为数字时mov al,[esi]sub al,30himul ebx,10movzx eax,aladd ebx,eaxdec edxinc esicmp edx,00Hjnz again1jmp done1again3: ;read1 记录负号数num inc esidec edxjmp again1done1: ;保护ebx,小数化成的整数,ecx小数位数push ebxpop ebxpop ecxpop edxsub edx,ecxdec edxpush ebxpush edx;------------------------------------------------------------------xor ecx,ecx //乘数的处理及储存xor ebx,ebxmov eax,offset msg2call dispmsgmov eax,offset readbuf2 ;设置入口参数eaxcall readmsg ;调用输入字符串子程序mov edx,eax ;edx记录字符位数push edx ;字符位数压入堆栈保护--------压入堆栈mov esi,offset readbuf2 ;esi指向readbuf1cmp byte ptr [esi],'-'jz again6again4:cmp byte ptr [esi],'.'jnz again5push ecx ;堆栈ecx----------inc esidec edxagain5:inc ecx ;read2循环字符为数字时mov al,[esi]sub al,30himul ebx,10movzx eax,aladd ebx,eaxdec edxinc esicmp edx,00Hjnz again4again6: ;read1 记录负号数numinc esiinc numdec edxjmp again4done2: ;done 保护ebx,小数化成的整数,ecx小数位数push ebxpop ebx ;ebx存入换算后的数据二整数pop ecxpop edxsub edx,ecxdec edx ;edx存入数据二小数位数pop ecx ;数据一的小数位数pop eax ;数据一的整数add ecx,edximul eax,ebxmov ebx,1done3:imul ebx,10dec ecxcmp ecx,0jnz done3mov edx,0div ebxcall dispuidmov eax,'.'call dispcmov eax,edxcall dispuid-------------------------------exit 0end start。

汇编addss指令

汇编addss指令

汇编addss指令全文共四篇示例,供读者参考第一篇示例:汇编语言是一种底层的程序设计语言,与机器语言的指令一一对应。

在汇编语言中,有许多指令可以用来完成不同的操作,其中addss指令是用来实现浮点数相加的指令之一。

addss指令用于将两个单精度浮点数相加,并将结果存储到目标操作数中。

这个指令的具体操作过程是将源操作数的值加到目标操作数的值上,并将结果存储到目标操作数中。

addss指令的语法格式通常如下:addss 目标操作数,源操作数在汇编语言中使用addss指令进行浮点数相加的操作通常需要以下几个步骤:1. 将要相加的单精度浮点数加载到寄存器中。

2. 使用addss指令将两个单精度浮点数相加,并将结果存储到目标操作数中。

3. 可以选择将结果存储到寄存器中或者内存地址中,根据需要进行操作。

下面通过一个简单的汇编语言示例来演示addss指令的使用过程:```assemblysection .datafloat1 dd 3.14 ; 定义一个单精度浮点数变量float1,初始化值为3.14float2 dd 2.72 ; 定义一个单精度浮点数变量float2,初始化值为2.72result dd 0 ; 定义一个单精度浮点数变量result,用于保存计算结果; 退出程序mov eax, 1 ; 调用exit系统调用xor ebx, ebxint 0x80```在这个示例中,我们定义了两个单精度浮点数变量float1和float2,然后使用addss指令将它们相加,并将结果保存在result变量中。

最后通过exit系统调用退出程序。

addss指令是汇编语言中用于单精度浮点数相加的指令,通过这个指令可以实现对浮点数的加法运算。

在实际开发中,我们可以根据需要使用addss指令来完成浮点数相加的操作,从而实现更加复杂的计算和处理。

【以上内容仅供参考,实际操作中需要根据具体情况进行调整】。

第二篇示例:汇编语言是一种底层的计算机语言,它直接操作计算机的硬件资源,包括寄存器、内存和输入输出设备。

汇编中的加法指令

汇编中的加法指令

加法指令ADD 加进位的加法指令ADC 加1指令INC
加法 指令
ADD
格式:ADD OPRD1,OPRD2 功能:OPRD1=OPRD1+OPRD2 ADD所影响的标志位有:CF、 DF、PF、SF、ZF和AF。 目的操作数C
格式:ADC OPRD1,OPRD2 功能: OPRD1=OPRD1+OPRD2+CF 所影响的标志位与ADD相同 ADC多用于多字节运算中,若 有两个4字节的数,已分别放在 FIRST和SECOND开始的存储 区中,每个数占4个存储单元。 存放时,最低字节在地址最低 处。
INC
格式:INC OPRD 功能:OPRD=OPRD+1 用途:在循环程序中修改地址 指令和循环次数等。INC指令 执行的结果不影响CF位,而对 其他5个标志位AF、OF、PF、 SF和ZF有影响。
标志 位的 变化 规则
有进位时CF=1,无进位时CF =0。OF位则根据操作数的符 号及其变化情况来设置;若两 个操作数的符号相同,而结果 的符号与之相反时,OF=1;否 则OF=0。溢出位OF既然是根据 数的符号及其变化来设置的, 当然它是用来表示带符号数的 溢出的。
关于 CF的 CF的 使用:
CF位可以用来表示无符号数的溢出。由于 无符号数的最高有效位只是数字意义,而 无符号怠义,所以从该位产生的进位应该 是结果的实际进位值,但是在有限数位的 范围内就说明了结果的溢出情况,另一方 面,它所保存的进位值有时是有用的。例 如,双字长数运算时,可以利用进位值把 低位字的进位计入高位字中等。这可以根 据不同情况在程序中加以处理。 OF位可以用来表示带符号数的溢出,CF 位可以用来表示无符号数的溢出。 说明:因为OF表示的只是有符号数 即只 有两个操作数符号相同,而结果的符号与 之相反时,OF=1,即表示有符号数溢出。 CF是进位标志,如果不是上述的地位字的 进位加到高位,即在有限的数位内如果无 符号数相加结构进位了,则说明相加结构 溢出。

汇编加减乘除指令

汇编加减乘除指令

汇编加减乘除指令⼀、ADD ADC INC和SUB SBB DEC1.加法指令2.减法指令CF (进位计数器,存进位值)sub和add指令要求:DST、SRC 不能同时为存储器,DST不能为⽴即数,运算结果对标志位有影响。

sbb和adc指令要求:DST、SRC 不能同时为存储器, SRC可为⽴即数,运算结果对标志位有影响。

例:date segmentx dw 56abh,34cdh,?,?y db ?,?,?,?date endscode segmentassume cs:code,ds:datestart:mov ax,datemov ds,axmov ax,xadd ax,x+2mov x+4,axmov ax,xsub ax,x+2mov x+6,axmov bl,byte ptr xadd bl,byte ptr x+2mov y,blmov bl,byte ptr x+1adc bl,byte ptr x+3mov y+1,blmov bl,byte ptr xsub bl,byte ptr x+2mov y+2,blmov bl,byte ptr x+1sbb bl,byte ptr x+3mov y+3,blmov ah,4chint 21hcode endsend startView Code⼆、MUL IMUL和DIV IDIV1.乘法指令2.除法指令date segmentbuff1 db 36,10,20sum1 db ?,?,?buff2 dw 100,40,1hsum2 dw ?,?,?date endscode segmentassume cs:code,ds:datestart:mov ax,datemov ds,axmov al,buff1+1mul buff1+2add ax,buff2mov dx,0div buff2+2sub ax,buff2+4mov sum2,axmov ah,4chint 21hcode endsend startView Code三、数值位数扩展新⼿学习,若有错误请留⾔,转载请附上博⽂连接,谢谢!。

汇编语言add指令用法

汇编语言add指令用法

汇编语言add指令用法汇编语言中的ADD指令是一种非常重要的指令之一,用于实现加法运算。

ADD指令的用法非常灵活,可以用于实现多种不同的加法操作。

本文将针对ADD指令的用法进行全面介绍,希望能够对相关读者有所启发和指导。

ADD指令的基本用法非常简单,其语法为ADD 目标操作数,源操作数。

其中目标操作数可以是寄存器或内存单元,而源操作数可以是寄存器、内存单元或立即数。

指令执行后,源操作数的值会加到目标操作数上,得到的结果存放在目标操作数中。

例如,下面的汇编代码使用ADD指令将寄存器AX的值加上立即数10,并将结果存放回寄存器AX中:```MOV AX, 5 ; 将AX寄存器的值设置为5ADD AX, 10 ; 将AX寄存器的值加上10```执行该代码后,AX寄存器中的值将变为15。

除了上述基本用法外,ADD指令还有许多其他的用法。

下面将分别介绍这些用法。

1. 实现寄存器之间的加法操作ADD指令最常用的用途是实现寄存器之间的加法操作。

例如,下面的代码使用ADD指令将寄存器AX和BX的值相加,并将结果存放到AX 中:```MOV AX, 5 ; 将AX寄存器的值设置为5MOV BX, 10 ; 将BX寄存器的值设置为10ADD AX, BX ; 将AX和BX的值相加,并将结果存放到AX中```执行该代码后,AX寄存器中的值将变为15。

2. 实现内存单元和立即数的加法操作除了实现寄存器之间的加法操作外,ADD指令还可以用于实现内存单元和立即数的加法操作。

例如,下面的代码使用ADD指令将内存单元[SI]中的值加上立即数10,并将结果存放回内存单元[SI]中:```MOV SI, offset data ; 将SI寄存器设置为data的偏移地址ADD byte ptr [SI], 10 ; 将[SI]中的值加上10```执行该代码后,data数据段中对应的内存单元中的值将增加10。

3. 实现内存单元和寄存器的加法操作除了实现内存单元和立即数的加法操作外,ADD指令还可以用于实现内存单元和寄存器的加法操作。

c++中add的用法

c++中add的用法

c++中add的用法在C++中,"add"是一个常用的方法名,常用来表示加法操作。

add方法的用途是将两个数相加并返回结果。

add方法可以用于不同的数据类型,包括整数、浮点数、双精度浮点数等。

下面是C++中使用add方法的一些例子:1. 整数相加:```cppint a = 3;int b = 4;int c = add(a, b); // 结果为7```2. 浮点数相加:```cppfloat x = 2.5;float y = 3.7;float z = add(x, y); // 结果为6.2```3. 双精度浮点数相加:```cppdouble p = 1.5;double q = 2.1;double r = add(p, q); // 结果为3.6```有一点需要注意的是,C++标准库中并没有直接提供一个名为“add”的函数。

要使用add方法,你可以自己定义一个函数,并根据需要定义参数类型和返回类型。

补充一点,如果你是想实现一个自定义的加法函数,你可以这样定义一个"add"函数:```cppint add(int a, int b) {return a + b;}float add(float a, float b) {return a + b;}double add(double a, double b) {return a + b;}```然后你可以根据需要选择合适的类型和参数进行调用,比如:```cppint x = 5;int y = 7;int z = add(x, y); // 结果为12float p = 3.2;float q = 4.8;float r = add(p, q); // 结果为8.0double m = 1.25;double n = 2.75;double o = add(m, n); // 结果为4.0```这样你就可以在你的程序中使用自定义的"add"函数来实现加法操作了。

汇编语言指令集.

汇编语言指令集.

汇编语言指令集 1.算术运算符 ADC:带进位加法 ADD:二进制数加法 DEC:减一DIV:无符号数除法 IDIV:带符号数(整数除法 IMUL:带符号数(整数乘法 INC:加一MUL:无符号书乘法 NEG:求补 SBB:带借位减法 SUB:二进制减法 XADD:交换并相加 2.ASCII-BCD转换 AAA:加后ASCII调整 AAD:除前ASCII调整 AAM:乘后ASCII调整 AAC:减后ASCII调整 DAA:加后十进制调整 DAS:减后十进制调整 3.移位 RCL:带进位循环左移 RCR:带进位循环右移 ROL:循环左移 ROR:循环右移 SAL:算术左移 SAR:算术右移 SHL:逻辑左移 SHR:逻辑右移 SHLD:双精度左移 SHRD:双精度右移 4.比较 BSF/BSR:位扫描 BT/BTC/BR/BB:位测试 CMP:比较 CMPSN:串比较 CMPXCHG:比较交换 CMPXCHG8B:比较并换?lt;br>TEST:测试位 5.数据传送LDS:装如数据段寄存器 LEA:装入有效地址 LES:装入附加段寄存器 LODS:从串取LSS:装入堆栈段寄存器 MOV:传送数据 MOVS:串传送 MOVSX:带符号扩展传送MOVZX:带零扩展传送 STOS:存入串 XCHG:交换 XLAT:换码 6.标志操作 CLC:清除位标志 CLD:清除方向标志 CLI:清除中断标志 CMC:进位标志求反 LAHF:标志送AH POPF:标志出栈 PUSHF:标志进栈 SAHF:AH送标志寄存器 STC:进位标志置1 CTD:方向标志置1 STI:中断标志置1 7.输入/输出 IN:输入字节或字 INSN:串输入OUT:输出字节或字 OUTSN:穿输出 8.逻辑操作 AND:逻辑与 NOT:逻辑非 OR:逻辑或 XOR:异或 9.循环 LOOP:循环直到完成 LOOPE:相等时循环 LOOPZ:为零是循环LOOPNE:不相等时循环 LOOPPNZ:不为零是循环 LOOPPNEW:不相等时循环LOOPNZW:不为零时循环 10.处理器控制 HLT:进入暂停状态 LOCK:封锁总线 NOP:无操作 WAIT:置处理器于等待状态 11.堆栈操作 ENTER:建立堆栈帧 LEAVE:结束堆栈帧 POP:字出栈 POPF:标志出栈 POPA:所有通用寄存器出栈 PUSH:字进栈PUSHA:所有通用积存器进栈 PUSHF:标志进栈 12.串操作 CMPS:串比较 LODS:从串取 MOVS:串传送 REP:串重复 REPE:相等时重复 REPZ:为零时重复 REPNE:不相等时重复 REPNZ:不为零时重复 SCAS:串扫描 STDS:存入串 13.转移(条件 INT溢出中断 JA:高于则转移 JAE:高于或等于则转移 JB:低于则转移 JBE:低于或等于则转移JC:进位为1则转移 JCXZ:CX为零则转移 JE:相等则转移 JG:大于则转移 JGE:大于或等于则转移 JL:小于则转移 JLE:小于或等于 JNC:进位为零则转移 JNE:不相等则转移 JNG:不大于则转移 JNGE:不大于或等于则转移 JNL:不小于则转移 JNLE:不小于或等于则转移 JNA:不高于则转移 JNB:不低于则转移 JNBE:不低于或等于则转移JNAE:不高于或等于则转移 JN不溢出则转移 JNP:奇偶位为0则转移 JNZ:结果不为零则转移 JNS:结果为正则转移 J若溢出则转移 JP:奇偶位为1则转移 JPE:奇偶性为偶则转移 JP奇偶性为奇则转移 JS:结果为负则转移 JZ:结果为零则转移 14.转移(无条件 CALL:调用过程 INT:中断 IRET:中断返回 JMP:无条件转移 RET:返回 RETN/RETF:近返回/远返回 15.类型转换 CBW:字节转换为字 CDQ:双字转换为四字 CWD:字转换为双字CWDE:字转换为扩展的双字。

汇编语言加减乘除四则运算实现源代码.

汇编语言加减乘除四则运算实现源代码.

汇编语言加减乘除四则运算实现源代码汇编语言加减乘除四则运算实现源代码 MOVBX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1DOUT2: POP AX ADDAL,'0' CMP AL,'9' JBEDOUT3 ADD AL,'A'-'9'-1DOUT3: CALLDISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POPAX RET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEAR PUSHBX PUSH BP PUSH DI XOR AX,AX XOR DX,DXDATE1: MOVDI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHLDI,1 RCL DX,1 Jmp shortDATE4DATE3: ADD DI,BX ADCDX,BPDATE4: ADD AX,DI ADCDX,0 JMP DATE1DATE5: ADDAL,9 JMP DATE2DATE6: JCXZDATE7 CMP AL,'A' JBDATE7 CMP AL,'F' JBEDATE5 CMP AL,'a' JBDATE7 CMP AL,'f' JBEDATE5DATE7: MOV AX,DI DECSI OR DI,DX POP DI POPBP POP BX RET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEAR MOVAX,NUM2 MOV DX,NUM2+2 CMPYSF1,'+' JZ JSJJ1 SUBNUM1,AX SBB NUM1+2,DX JMP SHORTJSJJ2JSJJ1: ADD NUM1,AX ADC NUM1+2,DX上一页[1] [2] [3] 下一页。

单片机add指令

单片机add指令

单片机add指令全文共四篇示例,供读者参考第一篇示例:单片机是一种集成电路,它可以作为微型计算机的核心部分来控制其他部件,如传感器、执行器等。

在单片机的指令集中,add指令是最基本的指令之一。

这篇文章将详细介绍add指令的功能、使用方法和示例。

add指令的作用是实现两个操作数的加法运算。

在单片机的指令集中,add指令的格式通常为add A, B,其中A和B分别代表要相加的两个操作数。

执行add指令后,将B中的值与A中的值相加,并将结果存储到A中。

如果执行add指令add A, B,那么A的值将会变为A+B。

在单片机程序设计中,add指令是非常常用的指令之一。

通过add指令,可以实现各种复杂的算术运算,比如加法、减法、乘法、除法等。

除了简单的加法运算,add指令还可以用于实现逻辑运算、位运算等各种操作。

掌握add指令的使用方法对于单片机程序设计非常重要。

下面我们通过一个简单的示例来演示add指令的使用方法。

假设我们有两个寄存器A和B,它们的初始值分别为10和20。

现在我们要利用add指令将它们相加并将结果存储到A中。

具体的程序代码如下:MOV A, #10 ;将10存储到寄存器A中MOV B, #20 ;将20存储到寄存器B中ADD A, B ;将A和B的值相加并存储到A中通过以上程序,我们可以看到,add指令将寄存器B的值20加到寄存器A的值10上,并将结果30存储到寄存器A中。

这样,我们就成功实现了两个操作数的加法运算。

第二篇示例:单片机是一种集成了微处理器、存储器和输入输出功能的微型计算机系统。

在单片机中,指令是计算机系统的基本执行单元,它决定了CPU在运行过程中的行为。

在单片机的指令集中,ADD指令是一个非常重要的指令,它用来实现两个操作数的相加运算。

本文将详细介绍单片机中的ADD指令,包括指令格式、功能及应用。

1. 指令格式:在单片机中,ADD指令是一条典型的算术指令,用于将两个操作数相加,并将结果存储到指定的目标操作数中。

汇编语言实现浮点相乘的程序

汇编语言实现浮点相乘的程序

汇编语言实现浮点相乘的程序姓名:学号:专业:通信工程汇编语言实现浮点相乘的程序摘要:介绍用汇编语言实现浮点相乘的原理算法、硬件框图、软件流程图,以及调试过程、步骤和结果。

并对结果进行了分析。

引言:在使用汇编语言的过程中,我们很容易对整数进行乘法操作,对于浮点乘法,却没有直接的方法,不能直接实现浮点相乘。

这就给我们使用汇编带来了很大的影响。

这个程序的作用就是用汇编语言实现简单的无符号浮点相乘的程序。

原理:1.指令介绍2.缓存区的定义readbuf1 byte 256 dup(0)3.算法1)数据存储:汇编语言只能进行整数相乘的计算,所以我们可以通过键盘将输入的浮点数通过字符记录到缓冲区中,每输入一个字符,内部程序对该字符进行判断是数字还是小数。

2)将小数转化成整数并记录:如果是数字,则储存在缓冲区的是ASCII码,所以应该减去30H,然后通过乘10累加的形式得到整数。

3)如果是小数点:记录小数点所在位置,同时指向下一位字符4)例如4.32这个数字。

将它以字符的形式存入缓冲区中,并记录字符数:4。

通过指针指向缓冲区地址,读取字符’4’,他的ASCII码是34H。

34H-30H=4H,4*10=40,保存40这个值。

指针加一,读取’.’。

软件流程图:浮点字符串转换成整数流程图:调试过程和步骤:1.程序代码:include io32.inc.datamsg1 byte '请输入第一个数字',13,10,0msg2 byte '请输入第二个数字',13,10,0readbuf1 byte 256 dup(0)readbuf2 byte 256 dup(0)num byte 00h ;记录负号个数.codestart:xor ecx,ecxxor ebx,ebxmov eax,offset msg1call dispmsgmov eax,offset readbuf1 ;设置入口参数eaxcall readmsg ;调用输入字符串子程序mov edx,eax ;edx记录字符位数push edx ;字符位数压入堆栈保护--------压入堆栈mov esi,offset readbuf1 ;esi指向readbuf1cmp byte ptr [esi],'-'jz again3again1:cmp byte ptr [esi],'.'jnz again2push ecx ;堆栈ecx----------inc esidec edxagain2:inc ecx ;read2循环字符为数字时mov al,[esi]sub al,30himul ebx,10movzx eax,aladd ebx,eaxdec edxinc esicmp edx,00Hjnz again1jmp done1again3: ;read1 记录负号数num inc esiinc numdec edxjmp again1done1: ;done 保护ebx,小数化成的整数,ecx小数位数-----------压入堆栈push ebxpop ebxpop ecxpop edxsub edx,ecxdec edxpush ebxpush edx;------------------------------------------------------------------xor ecx,ecxxor ebx,ebxmov eax,offset msg2call dispmsgmov eax,offset readbuf2 ;设置入口参数eaxcall readmsg ;调用输入字符串子程序mov edx,eax ;edx记录字符位数push edx ;字符位数压入堆栈保护--------压入堆栈mov esi,offset readbuf2 ;esi指向readbuf1cmp byte ptr [esi],'-'jz again6again4:cmp byte ptr [esi],'.'jnz again5push ecx ;堆栈ecx----------inc esidec edxagain5:inc ecx ;read2循环字符为数字时mov al,[esi]sub al,30himul ebx,10movzx eax,aladd ebx,eaxdec edxinc esicmp edx,00Hjnz again4jmp done2again6: ;read1 记录负号数numinc esiinc numdec edxjmp again4done2: ;done 保护ebx,小数化成的整数,ecx小数位数-----------压入堆栈push ebxpop ebx ;ebx存入换算后的数据二整数pop ecxpop edxsub edx,ecxdec edx ;edx存入数据二小数位数pop ecx ;数据一的小数位数pop eax ;数据一的整数add ecx,edximul eax,ebxmov ebx,1done3:imul ebx,10dec ecxcmp ecx,0jnz done3mov edx,0div ebxcall dispuidmov eax,'.'call dispcmov eax,edxcall dispuid;-------------------------------------------------------------------exit 0end start2.调试过程:1)在D:\32位微机配套软件dos16\MASM目录下新建一个asm文档,名为float2)打开并编写程序3)打开D:\32位微机配套软件dos16\MASM目录下该图标:4)5)6}实验结果:Matlab计算结果:结果分析:用汇编语言编写的程序计算结果和MATLAB计算结果一致。

汇编实现加减乘除的程序

汇编实现加减乘除的程序

汇编实现加减乘除的程序DATA SEGMENTSTRING1 DB 0DH,0AH,'Please input the first numbers:',0DH,0AH,'$'STRING2 DB 0DH,0AH,'Please input the second numbers:',0DH,0AH,'$'NUM1 DW 0NUM2 DW 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,STRING1 ;9号功能,显示字符串1输入第一个数MOV AH,09HINT 21HLP:MOV AH,1INT 21HCMP AL,0DH ;当输入的字符为回车结束数据输入JZ NEXTSUB AL,30HMOV AH,0MOV CX,AXMOV BX,10MOV AX,NUM1MUL BXADD AX,CXMOV NUM1,AXJMP LPNEXT:LEA DX,STRING2 ;9号功能,显示字符串2输入第二个数MOV AH,09HINT 21HLP1:MOV AH,1INT 21HCMP AL,0DHJZ NEXT1 ;;当输入的字符为回车结束数据输入SUB AL,30HMOV AH,0MOV CX,AXMOV BX,10MOV AX,NUM2MUL BXADD AX,CXMOV NUM2,AXJMP LP1NEXT1:CALL DOO ;调用换行子程序CALL A ;调用加法子程序CALL DOOCALL B ;调用减法子程序CALL DOOCALL C ;调用乘法子程序CALL DOOCALL D ;调用换行子程序MOV AH,4CH ;返回DOSINT 21HA PROC NEAR ;加法子程序MOV DX,NUM1CALL PRINT ;调用数据以十进制输出子程序,把NUM1以十进制形式输出MOV DL,'+'CALL STDOUT ;调用输出子程序,把+号输出MOV DX,NUM2CALL PRINTMOV DL,'=' ;调用输出子程序,把=号输出CALL STDOUTMOV AX,NUM1ADD AX,NUM2MOV DX,AXCALL PRINTRETA ENDPB PROC NEAR ;减法子程序MOV DX,NUM1CALL PRINTMOV DL,'-'CALL STDOUTMOV DX,NUM2CALL PRINTMOV DL,'='CALL STDOUTMOV AX,NUM1MOV BX,NUM2SUB AX,BXMOV DX,AXCALL PRINTRETB ENDPC PROC NEAR ;乘法子程序MOV DX,NUM1CALL PRINTMOV DL,'*'CALL STDOUTMOV DX,NUM2CALL PRINTMOV DL,'='CALL STDOUTMOV AX,NUM1MOV DX,0MUL NUM2MOV DX,AXCALL PRINTRETC ENDPD PROC NEAR ;除法子程序MOV DX,NUM1CALL PRINTMOV DL,'/'CALL STDOUTMOV DX,NUM2CALL PRINTMOV DL,'='CALL STDOUTMOV DX,0MOV AX,NUM1DIV NUM2MOV DX,AXCALL PRINTRETD ENDPPRINT PROC NEAR ;数据以十进制输出子程序PUSH DXPUSH AXPUSH CXPUSH BXMOV CX,0DO:MOV AX,DXMOV DX,0MOV BX,10DIV BXXCHG AX,DXADD AL,30HPUSH AXINC CXCMP DX,0JNZ DODO1:POP AXMOV DL,ALCALL STDOUTLOOP DO1POP BXPOP CXPOP AXPOP DXRETPRINT ENDPSTDOUT PROC NEAR ;输出子程序MOV AH,2INT 21HRETSTDOUT ENDPDOO PROC NEAR ;换行子程序MOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HRETDOO ENDPCODE ENDS END START。

plc的加减乘除运算编程

plc的加减乘除运算编程

plc的加减乘除运算编程PLC(可编程逻辑控制器)是一种专门用于自动化控制的电子设备,广泛应用于工业领域。

在PLC编程中,加减乘除运算是常见的操作,本文将围绕这一主题展开讨论。

一、PLC加法运算编程在PLC编程中,加法运算常用于对不同信号或数据进行求和。

通过使用PLC的运算指令,可以实现对输入信号或数据进行加法运算,并将结果输出到指定的输出端口或寄存器中。

例如,我们可以通过以下的PLC代码实现两个输入信号的加法运算:```LD X0 // 将X0输入信号加载到内存中ADD X1 // 将X1输入信号与加载到的X0信号相加OUT Y0 // 将加法运算结果输出到Y0输出端口```二、PLC减法运算编程减法运算是PLC编程中常用的一种运算方式。

通过使用PLC的减法指令,可以对输入信号或数据进行减法运算,并将结果输出到指定的输出端口或寄存器中。

下面是一个实现两个输入信号的减法运算的PLC代码示例:```LD X0 // 将X0输入信号加载到内存中SUB X1 // 将加载到的X0信号减去X1输入信号OUT Y0 // 将减法运算结果输出到Y0输出端口```三、PLC乘法运算编程乘法运算在PLC编程中也是常见的一种运算方式。

通过使用PLC的乘法指令,可以对输入信号或数据进行乘法运算,并将结果输出到指定的输出端口或寄存器中。

以下是一个实现两个输入信号的乘法运算的PLC代码示例:```LD X0 // 将X0输入信号加载到内存中MUL X1 // 将加载到的X0信号与X1输入信号进行乘法运算OUT Y0 // 将乘法运算结果输出到Y0输出端口```四、PLC除法运算编程除法运算也是PLC编程中常用的一种运算方式。

通过使用PLC的除法指令,可以对输入信号或数据进行除法运算,并将结果输出到指定的输出端口或寄存器中。

下面是一个实现两个输入信号的除法运算的PLC代码示例:```LD X0 // 将X0输入信号加载到内存中DIV X1 // 将加载到的X0信号除以X1输入信号OUT Y0 // 将除法运算结果输出到Y0输出端口```PLC的加减乘除运算编程是PLC编程中常见且重要的一部分。

汇编运算类指令

汇编运算类指令

算术运算类指令用来执行二进制及十进制的算术运算:加减乘除。

这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果。

一、加法指令1、加法指令ADDADD reg,imm/reg/mem ;reg←reg+imm/reg/memADD mem,imm/reg ;mem←mem+imm/regADD指令按照状态标志的定义相应的设置这些标志的0或1状态。

2、带进位标志加法指令ADCADC reg,imm/reg/mem ;reg←reg+imm/reg/mem+CFADC me m,imm/reg ;mem←mem+imm/reg+CFADC指令除完成ADD加法指令运算外,还要加进位CF。

3、增量指令INCINC reg/mem ;reg/mem←reg/mem+1INC指令对操作数加1(增量)。

它是一个单操作数指令。

设计加1指令和后面介绍的减1指令的目的,主要是用于对计数器和地址指针的调整,所以他们不影响进位CF标志,对其他标志位的影响与ADD,ADC相同。

二、减法指令1、减法指令SUBSUB reg,imm/reg/mem ;reg←reg-imm/reg/memSUB mem,imm/reg ;mem←mem/reg2、带借位减法指令SBBSBB reg,imm/reg/mem ;reg←reg-imm/reg/mem-CFSBB mem,imm/reg ;mem←mem-imm/reg-CF3、减量指令DECDEC reg/mem ;reg/mem←reg/mem-1同样不影响CF标志。

4、求补指令NEGNEG reg/mem ;reg/mem←0-reg/memNEG指令也是一个单操作数指令,它对操作数执行求补运算,即用零减去操作数,然后结果返回操作数。

求补运算也可以表达成:将操作数按位求反后加1。

5、比较指令CMPCMP reg,imm/reg/mem ;reg-imm/reg/memCMP mem,imm/reg ;mem-imm/reg该指令将目的操作数减去源操作数,但结果不回送目的操作数。

汇编语言只用ADD指令实现整数和浮点数的加减乘法

汇编语言只用ADD指令实现整数和浮点数的加减乘法

课程项目报告一、要求:利用汇编语言完成以下功能:通过键盘输入二进制指令,对指令译码,完成相应的加、减和乘操作全过程。

只能使用汇编的ADD指令,不能使用汇编已有的其他加法、加法和乘法指令。

**其中00为加法,01为减法,10为乘法*指令格式二为:*操作码*第一定点数*第二定点数*第一浮点数*第二浮点数*7170 *696867*666564*63.........32*31.. 0*其中当操作码为11,第二定点数全为0,第一定点数分别为000,001,010时,分别执行第一浮点数和第二浮点数的加、减和乘法操作,浮点数格式采用IEEE754标准。

二、程序流程:1.通过中断输入要译码的二进制字符流;2.选择其前8位合成1个数(如00101001就可合并为29H),先对其进行要运算的判定。

通过依次移位将最左端的值放进CF位,判断其值为0或1跳转到相应的位置进行运算;3.此程序显然有六种运算:1)整数加法:最简单的一种,将两个操作数通过移位和设定寄存器的初值来获得,然后只需调用加法使两个寄存器相加即可,将结果存入result内存单元中。

并通过中断对结果进行输出到屏幕的显示。

2)整数减法:取数和加法一致,但由于规定只能使用加法指令,因此必须先将减数的值进行求补(取反加1),再进行加法指令即可,将结果存入result内存单元中。

并通过中断对结果进行输出到屏幕的显示。

3)整数乘法:利用硬件实现乘法的思想,通过判断第二个操作数的未判断的较低位决定是加被乘数还是加0的操作,然后将结果右移,直到将操作数的所有位判断完毕(最后一位不移位),将结果存入result内存单元中。

并通过中断对结果进行输出到屏幕的显示。

4)浮点数加法:前面取了前8位归并后,将指针的位置保留下来,现在将其指针弹栈继续对剩下的输入的字符进行操作。

首先调用子程序将剩下的输入字符流存入内存以待使用(将字符流转变成数值并组成一个完整的数字,即浮点数有三个数:1位的数符,8位的阶码,23位的数值)。

汇编add指令用法

汇编add指令用法

汇编add指令用法汇编语言是一种底层的计算机语言,它与计算机硬件直接交互,能够对计算机内存中的数据进行操作。

在汇编语言中,add(加法)指令是非常常用且重要的指令之一,用于进行加法运算。

本文将全面介绍add指令的用法,并给出一些指导意义。

首先,add指令的基本用法是将两个操作数相加,并将结果保存在目标操作数中。

这个目标操作数可以是寄存器、内存地址或是立即数。

例如,可以使用add指令将两个寄存器中的值相加,并将结果存储到另一个寄存器中,或者将一个寄存器和一个内存地址中的数据相加,并将结果存储到寄存器中。

在汇编语言中,add指令通常采用以下形式:add 目标操作数,源操作数。

其中,目标操作数是被加的数,而源操作数则是要加的数。

具体的操作数可以是寄存器、内存地址或立即数。

通过使用add指令,可以实现很多有用的功能。

例如,可以使用add指令进行加法运算,实现两个数相加的功能。

在进行加法运算时,需要注意数据溢出的问题。

因为计算机中数据的表示有限,当两个数相加的结果超过了表示范围时,就会产生溢出。

为了避免溢出,我们可以使用扩展的add指令,如addc(加法带进位)指令,来处理溢出情况。

此外,add指令还可以用于实现其他功能,如计算机算术逻辑单元(ALU)中的加法器。

在ALU中,add指令被用于进行两个二进制数的加法运算。

通过使用多个add指令,可以实现更加复杂的运算,如乘法和除法。

在编写汇编程序时,我们需要注意一些指导意义。

首先,要明确add指令的操作数类型和大小。

不同的处理器可能对操作数的大小有限制,因此需要根据具体的处理器来选择合适的指令。

此外,还需要注意数据的有符号和无符号表示,以及溢出和进位的处理。

这些因素都需要在编写代码时进行仔细考虑,以确保程序的正确性和可靠性。

总而言之,add指令是汇编语言中一项重要的指令,用于实现加法运算和其他功能。

在编写汇编程序时,我们需要熟悉add指令的用法,并注意数据的表示和处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.整数减法
输入:
输出:
这里和整数加法是一样的输出设置,因此结果为01(010-001),正确。
4.整数乘法
输入:
输出:
输出为1(001*001),结果正确。
5.浮点数加法:
注意:这里输入并未输入特别规范的移码表示其阶码的格式,这样输入比较简单,而且在两个阶码均正的情况下不会涉及到大小对阶时判断错误的情况。
beginmu:
shr bx,1;判断最后一位是否为1
jc add1;CF=1
ror dx,1;将最后总和右移,为下一步做铺垫
loop beginmu
mov cl,3
rol dx,cl;将最后的结果放到dh保存
mov result,dh;再移到result
call DISPLAY_RESULT
ret
;exitt dw "溢出$"
tempr dw ?
data ends
code segment
main proc far
assume ds:data,cs:code
start:mov ax,data
mov ds,ax
call inputBAndSelect8
push bx;将下一字符的地址放入堆栈
mov bh,ah;将输入的字符放到bh
;==================================================
;浮点数的加法,取相应的数据进行对阶-运算-右归操作
FLOAT_ADD proc near
call SAVE_FLOAT_DATA
mov ch,float1_jie
mov cl,float2_jie
float1_sign db ?
float1_jie db ?
float1_figure dd ?
float1_figure_bu dd ?
float2_sign db ?
float2_jie db ?
float2_figure dd ?
float_jie db ?,'$'
result dd ?,'$'
操作码
第一定点数
第二定点数
第一浮点数
第二浮点数
71 70
69 68 67
66 65 64
63………32
31………..0
其中当操作码为11,第二定点数全为0,第一定点数分别为000,001,010时,分别执行第一浮点数和第二浮点数的加、减和乘法操作,浮点数格式采用IEEE754标准。
二、程序流程:
1.通过中断输入要译码的二进制字符流;
输出:
注意:阶码为0(浮点数1和2的阶码均为0的结果)
注意:浮点数23位数值的计算结果为002,这里我将其设为十进制,但在用的时候还必须将其转变为二进制才可用,例如这个的最后结果应该为1.00000000000000000000010*2^0,可知结果正确。
附录:代码
data segment
user_string db 75,?,72 dup(?)
INTEGER_ADD proc near
mov bl,0
mov cl,3
rol bx,cl;取第一个操作数放到bl
mov ch,bl;转存到ch
mov bl,0
rol bx,cl;取第二个操作数放到bl
mov cl,bl;转存到ch
add ch,cl;第一个操作数和第二个操作数做加法
mov result,ch
mov [bx],al
add ah,al;将输入的字符串组成一个数
rol ah,1
add bx,1
loop beginin
mov al,[bx];最后一次不用移位
add al,208;将字符串变为数值
mov [bx],al
add ah,al;将输入的字符串组成一个数
add bx,1;指向下一个字符
ret
mov ax,float1_figure
mov bx,float1_figure+2
xor ch,ch
beginmove1_a:
shr bx,1
shr ax,1
jc adjust_a
loop beginmove1_a
mov cx,float2_figure
mov dx,float2_figure+2
INTEGER_SUB proc near
mov bl,0
mov cl,3
rol bx,cl;取第一个操作数放到bl
mov ch,bl;转存到cl
mov bl,0
rol bx,cl;取第二个操作数放到bl
mov cl,bl;转存到ch
not cl;将第二个操作数取反
add cl,1;取反加1求补
add ch,cl;第一个操作数和第二个操作数的补相加
mov result,ch
call DISPLAY_RESULT
ret
INTEGER_SUB endp
;==================================================
;====================================================
课程项目报告
一、要求:
利用汇编语言完成以下功能:
通过键盘输入二进制指令,对指令译码,完成相应的加、减和乘操作全过程。只能使用汇编的ADD指令,不能使用汇编已有的其他加法、加法和乘法指令。
指令格式一为:
操作码
第一操作数
第二操作数
7 6
5 4 3
2 1 0
其中00为加法,01为减法,10为乘法
指令格式二为:
;整数乘法,bh中只有两个操作数,各三位,最后结果存放到result内存
INTEGER_MUL proc near
mov bl,0
mov cl,3
rol bx,cl;取第一个操作数放到bl
mov al,bl;转存到al
mov bl,0
rol bx,cl;取第二个操作数放到bl
mov dx,0;初始化结果为0
call INTEGER_SUB
others:
rol bx,1;取第二个操作码到cf
jnc INTEGERmul;CF=0
jnz FLOAT;CF=1
INTEGERmul:
call INTEGER_MUL
FLOAT:
mov bl,0
mov cl,3
rol bx,cl;取第一个定点数放到bl
mov ch,bl;转存到ch
inputBAndSelect8 proc near
lea bx,user_string
mov ah,0ah
int 21h
mov ch,0
add bx,2;指向真正字符串开始的位置
mov aБайду номын сангаас,0
mov cl,8
add cl,255
beginin:
mov al,[bx]
add al,208;将字符串变为数值
inputBAndSelect8 endp
;==================================================
;==================================================
;整数加法,bh中只有两个操作数,各三位,最后结果存放到result内存
5)浮点数减法:与加法一样先调用中断将剩下的浮点数信息存入内存。与加法不同的是由于只能用加法指令,在操作的时候同样需先对第二个浮点数进行求补操作(取反加1),然后在进行与加法一样的操作,最后将阶码存到float_jie内存,数值运算结果存入result单元。并通过中断对阶码和数值进行输出显示。
6)浮点数乘法:与前面两个浮点数的操作一样先将剩下的浮点数信息存入内存。我们这里操作数均取得补码,因此用booth算法做乘法运算(通过移位取最低两位进行判断,如果相同则加0,如果ynyn-1=10,则加【x】补,如果为ynyn-1=01,则加【-x】补),通过23次的判断,进行加法操作和移位,最终得到结果,将阶码存到float_jie内存,数值运算结果存入result单元。并通过中断对阶码和数值进行输出显示。
mov bl,0
rol bx,cl;取第二个定点数放到bl
mov cl,bl;转存到cl
and cx,cx
jz FLOATadd
test cx,10h
jz FLOATsub
test cx,20h
jz FLOATmul
FLOATadd:
call FLOAT_ADD
FLOATsub:
call FLOAT_SUB
not ch
add ch,1
add cl,ch
cmp cl,0
jg DUI_JIE_a;第二个浮点数的阶码比较大
cmp cl,0
jz DUI_JIE2_a
not cl
add cl,1
cmp cl,0
jg DUI_JIE1_a
DUI_JIE_a:
mov ch,float2_jie
mov float_jie,ch
三、在此给出部分运行结果:
1.整数加法
输入:
注意:指令P下面的二进制字符流严格按照要求的格式进行输入
输出:
注意:由于我在存储的时候将result内存设为了dd型,而我在存的时候存在了高位,在内存中是以大端格式存储,对于此题我们只用到了三位数的加法,显然可以看出最后结果为02(001+001),正确。
4)浮点数加法:前面取了前8位归并后,将指针的位置保留下来,现在将其指针弹栈继续对剩下的输入的字符进行操作。首先调用子程序将剩下的输入字符流存入内存以待使用(将字符流转变成数值并组成一个完整的数字,即浮点数有三个数:1位的数符,8位的阶码,23位的数值)。此次运算严格按照浮点数的运算进行,即先对阶(阶码小的向阶码大的对齐)->取数运算(由于输入的是二进制字符流,因此在运算之前需根据数符对数值进行补码操作,而且由于有23位数值,通用寄存器只有16位,需调用两个寄存器来运算,注意低位是否有向高位的进位)->规格化,最后将阶码存到float_jie内存,数值运算结果存入result单元。并通过中断对阶码和数值进行输出显示。
相关文档
最新文档