程序如下:
#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 编译到此结束
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)