编写两个3*3矩阵相加减的程序?

编写两个3*3矩阵相加减的程序?,第1张

矩阵的大小可以通过N,M来改变,数据自己也可以改为你想要的.

程序如下:

#define N 3

#define M 3

main()

{

int a[N][M]={1,2,3,4,5,6,7,8,9}, b[N][M]={9,8,7,6,5,4,3,2,1},c[N][M],d[N][M],i,j

for(i=0i<Ni++)

for(j=0j<Mj++)

{

c[i][j]=a[i][j]+b[i][j]/*相加A+B*/

d[i][j]=a[i][j]-b[i][j]/*相减A-B*/

}

for(i=0i<Ni++)

{

for(j=0j<Mj++)

printf("%d ",c[i][j])

printf("\n")

}

pingtf("\n")

for(i=0i<Ni++)

{

for(j=0j<Mj++)

printf("%d ",d[i][j])

printf("\n")

}

}

汇编语言中,当执行减法指令时,如果被减数小于减数时,同样也是要向高位产生借位 *** 作的。需要注意理解的是在通常的十进制运算中,低位向高位借位时,是借1得10,而汇编语言中用到十六进制 *** 作数,向高位借1得到的是16。题目中34H减90H,低四位相减等于4,高四位相减3小于9,要发生借位,借得16加3等于19,19减9等于10,即16进制A。所以减法指令得到的结果是A4。在减法指令后面跟有一条DAS指令,将减法运算的结果调整为十进制表示的BCD码,高位A>9,减6。这时虽看不到负数,但在调整高位时标志寄存器中的进位标识位被置位,由此可判断结果的正负。

程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

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

---------------------------------------

功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

---------------------------------------

Clear_Screen proc Near 清屏

push es

mov ax,0b800h

mov es,ax

xor di,di

mov al,20h

mov ah,es:[di][1] 取字符显示属性

mov cx,2000

cld

rep stosw 清屏

pop es

xor dx,dx

xor bh,bh

mov ah,2

int 10h

ret

Clear_Screen endp

---------------------------------------

Addition Proc Near 加法运算

lea ax,Addition

push ax

mov cl,'+'

mov ch,'1'

call Input_Digit

add al,ah 加法

aaa ASCII码加调整

@@Disp_Resault:mov ah,2

push ax

jnc $+6

mov dl,ch

int 21h

pop ax

or al,30h

mov dl,al

int 21h

call Continue_Back

ret

Addition EndP

---------------------------------------

Subtration Proc Near 减法运算

lea ax,Subtration

push ax

mov cl,'-'

mov ch,'-'

call Input_Digit

sub al,ah 减法

jnc $+6

neg al

jmp @@Disp_Resault

aas ASCII码减调整

jmp @@Disp_Resault

Subtration EndP

---------------------------------------

输入两个十进制数

Input_Digit Proc Near

Output prompt_1 提示输入第一个数

call @@Input

mov bl,al

Output prompt_2 提示输入第二个数

call @@Input

mov bh,al

mov dx,bx

call Output_CTLF

mov ah,2

mov dl,bl

int 21h

mov dl,cl

int 21h

mov dl,bh

int 21h

mov dl,'='

int 21h

mov ax,bx

ret

prompt_1 db 13,10,'Please input the first digit:$'

prompt_2 db 13,10,'Please input the second digit:$'

@@Input: mov ah,1

int 21h

cmp al,'0'

jb @@Input

cmp al,'9'

ja @@Input

ret

prompt_3 db 13,10,'Continue/Back(C/B)?$'

Continue_Back: pop ax

Output prompt_3

@@Press_0: mov ah,1

int 21h

or al,20h 转换成小写

cmp al,'c'

jnz $+3

ret

cmp al,'b'

jnz @@Press_0

pop ax

ret

Input_Digit EndP

---------------------------------------

Main_Menu db 'add',13,10,'subtract',13,10,'quit',13,10,'$'

Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'

Start:push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

@@Menu: call Clear_Screen 清屏

Output Main_Menu 显示菜单

@@Press_1: mov ah,1

int 21h

or al,20h 转换成小写

cmp al,'q'

jz Exit_Proc 结束程序

cmp al,'a'

jnz $+10

call Clear_Screen

call Addition 加法

jmp @@Menu

cmp al,'s'

jnz @@Press_1

call Clear_Screen

call Subtration 减法

jmp @@Menu

-----------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Buffer dw ?,? 数据缓冲区

Code ENDS

END Start 编译到此结束


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

原文地址: http://outofmemory.cn/yw/8110856.html

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

发表评论

登录后才能评论

评论列表(0条)

保存