一个简单的汇编语言编程

有没有高人可以帮我用汇编语言编写一个10*10局真相乘的代码?
就是可以直接在汇编运行环境下运行的。本人没有学过汇编,但目前急需这么一个小的汇编程序。高分求助!!!!!!!!!!!!!!得到答案肯定给最佳!!!!!!
抱歉,我们要求得作业是用DLX汇编编写矩阵相乘的程序,然后再WINDLX下观察程序的流水线运行情况,鲲鹏展翅LHY ,你的程序真的能转,但是在WINDLX下不能运行,请问你知道怎么转换一下吗?
如果能帮我在WINDLX下运行,我再多给20分!!!

终于调通了,先以乘积矩阵中元素值不大于9来输入矩阵1和矩阵2各元素的值,我是以下面的两个矩阵为例调试的程序:
矩阵1为:
1 1 1
1 1 2
1 1 3
矩阵2为:
3 1 1
2 1 1
1 1 1
得到结果矩阵为:
6 3 3
7 4 4
8 5 5

DATA SEGMENT;数据段定义
INFORMATION DB "Please enter the matrix1!The array is 3*3!$" ;提示说明
SPACE DB 0DH,0AH,"$" ;换行
MATRIX1 DB 9 DUP(?),"$" ;矩阵1
MATRIX2 DB 9 DUP(?),"$" ;矩阵2
RESULT DB 9 DUP(0),"$" ;矩阵相乘结果
M1 DB 0DH,0AH,"The array1:$" ;提示信息
M2 DB 0DH,0AH,"The array2:$"
M3 DB 0DH,0AH,"Array1*Array2:$"
DATA ENDS

CODE SEGMENT;定义代码段
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
MOV AX,DATA ;置DS段初值
MOV DS,AX
LEA DX,INFORMATION ;取信息提示地址偏移量
MOV AH,9 ;9号功能调用显示提示信息
INT 21H
LEA DX,SPACE;换行
MOV AH,9 ;9号功能调用显示提示信息
INT 21H

LEA DX,M1;提示输入矩阵1
MOV AH,9
INT 21H

MOV CX,09H
MOV BX,OFFSET MATRIX1;取矩阵1的偏移地址
INPUT1:
MOV AH,1
INT 21H;1号功能调用,用来输入数组数值
MOV [BX],AL
INC BX
LOOP INPUT1

LEA DX,M2 ;提示输入矩阵2
MOV AH,9
INT 21H

MOV CX,09H
MOV BX,OFFSET MATRIX2 ;取矩阵2的偏移地址
INPUT2:
MOV AH,1
INT 21H ;1号功能调用,用来输入数组数值
MOV [BX],AL
INC BX
LOOP INPUT2

MOV CX,3;设置循环次数
MOV BP,OFFSET RESULT
MOV SI,OFFSET MATRIX1

NEXT:
PUSH CX
XOR AX,AX
MOV DI,OFFSET MATRIX2
MOV CX,3;设置循环次数

NEXT1:
PUSH CX
XOR AX,AX
MOV CX,3;设置循环次数

AGAIN:
MOV AL,[SI] ;取矩阵1的偏移地址
SUB AL,30H;字符转换成数字
MOV BL,[DI] ;取矩阵2的偏移地址
SUB BL,30H;字符转换成数字
IMUL BL ;矩阵1的行和矩阵2的列相乘
ADD DS:[BP],Al
INC SI
ADD DI,3
LOOP AGAIN
ADD BYTE PTR DS:[BP],30H;数字转换成字符
SUB SI,3
SUB DI,8
INC BP
POP CX
LOOP NEXT1

ADD SI,3
POP CX
LOOP NEXT

LEA DX,M1;显示矩阵信息以及相乘后的结果
MOV AH,9
INT 21H

LEA DX,MATRIX1
MOV AH,9
INT 21H

LEA DX,M2
MOV AH,9
INT 21H

LEA DX,MATRIX2
MOV AH,9
INT 21H

LEA DX,M3
MOV AH,9
INT 21H

LEA DX,RESULT
MOV AH,9
INT 21H

MOV AH,1
INT 21H

MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-10-15
DATA SEGMENT ;数据段定义
INFORMATION DB "Please enter the matrix1!The array is 3*3!$" ;提示说明
SPACE DB 0DH,0AH,"$" ;换行
MATRIX1 DB 9 DUP(?),"$" ;矩阵1
MATRIX2 DB 9 DUP(?),"$" ;矩阵2
RESULT DB 9 DUP(?),"$" ;矩阵相乘结果
M1 DB 0DH,0AH,"The array1:$" ;提示信息
M2 DB 0DH,0AH,"The array2:$"
M3 DB 0DH,0AH,"Array1*Array2:$"
DATA END
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;置DS段初值
MOV DS,AX
MOV AX,A
SHOWINFORMATION:LEA DX,INFORMATION ;取信息提示地址偏移量
MOV AH,9 ;9号功能调用显示提示信息
INT 21H
LEA DX,SPACE ;换行
INT 21H

LEA DX,M1 ;提示输入矩阵1
MOV AH,9
INT 21H
MOV CX,09H
MOV AH,1
MOV BL,LEA OFFSET MATRIX1 ;取矩阵1的偏移地址
INPUT1: INT 21 ;1号功能调用,用来输入数组数值
MOV [BL],AL
ADD BL
MOV AH,1
LOOP INPUT1
LEA DX,M2 ;提示输入矩阵2
MOV AH,9
INT 21H
MOV CX,09H
MOV AH,1
MOV BL,LEA OFFSET MATRIX2 ;取矩阵2的偏移地址
INPUT2: INT 21 ;2号功能调用,用来输入数组数值
MOV [BL],AL
ADD BL
MOV AH,1
LOOP INPUT2

XOR AX,AX
MOV DL,OFFSET MATRIX1
MOV DH,OFFSET MATRIX2
MOV BH,OFFSET RESULT
MOV CX,03H
CALL LINEMULCOLOUM ;调用矩阵1某行和矩阵2的列相乘子程序
MOV DL,OFFSET MATRIX1+3
MOV DH,OFFSET MATRIX2
MOV BH,OFFSET RESULT+3
MOV CX,03H
CALL LINEMULCOLOUM
MOV DL,OFFSET MATRIX1+6
MOV DH,OFFSET MATRIX2
MOV BH,OFFSET RESULT+6
MOV CX,03H
CALL LINEMULCOLOUM

LEA DX,M1 ;显示矩阵信息以及相乘后的结果
MOV AH,9
INT 21H
LEA DX,MATRIX1
MOV AH,9
INT 21H
LEA DX,M2
MOV AH,9
INT 21H
LEA DX,MATRIX2
MOV AH,9
INT 21H
LEA DX,M3
MOV AH,9
INT 21H
LEA DX,RESULT
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
LINEMULCOLOUM PROC NEAR ;矩阵相乘子程序
STR: PUSH CX
MOV CX,3 ;设置循环次数
MOV AL,[DL] ;取矩阵1的偏移地址
MOV BL,[DH] ;取矩阵2的偏移地址
PUSH DX ;数值进栈保存
AGAIN: IMUL BL ;矩阵1的行和矩阵2的列相乘
ADD DX,AX
MOV [BH],DX
POP DX
MOV AH,DH
ADD AH,03H
MOV BL,[AH]
ADD DL,01H
MOV AL,[DL]
PUSH DX
LOOP AGAIN
POP DX
SUB DL,03H
ADD BH,01H
POP CX
LOOP STR
EXIT: ENDP
CODE ENDS
END START

几乘几都没问题。。。
第2个回答  2007-10-19
用16位汇编忒麻烦,用masm8.0写了个,玩一下:

.386
.model flat, stdcall
option casemap :none

includelib kernel32.lib
includelib msvcrt.lib

printf proto C :VARARG
putchar proto C :DWORD
system proto C :DWORD
ExitProcess proto :DWORD

CTXT MACRO quoted_text:VARARG
LOCAL local_text
.data
local_text db quoted_text, 0
align 4
.code
EXITM <local_text>
ENDM

SADD MACRO quoted_text:VARARG
EXITM <addr CTXT(quoted_text)>
ENDM

; matrix的维度
M equ 10
N equ 10
P equ 10

.data
; ------------------------
; matrix1 M * N
; ------------------------
mx1 dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1

; ------------------------
; matrix2 N * P
; ------------------------
mx2 dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1
dd 1,1,1,1,1,1,1,1,1,1

; ------------------------
; matrix3 M * P
; ------------------------
mx3 dd M*P dup(0)

.code
start:
xor eax, eax
lp1:
jmp ts1
up1:
pop eax
inc eax
ts1:
cmp eax, M
jge over
push eax
lp2:
xor ebx, ebx
jmp ts2
up2:
pop ebx
inc ebx
ts2:
cmp ebx, P
jge jtb_up1
push ebx
lp3:
xor ecx, ecx
jmp ts3
up3:
pop ecx
inc ecx
ts3:
cmp ecx, N
jge jtb_up2
push ecx

mov edx, eax
imul edx, edx, P*4
push edx
mov esi, mx3[edx+ebx*4]

mov edx, eax
imul edx, edx, N*4
mov edi, mx1[edx+ecx*4]

mov edx, ecx
imul edx, edx, P*4
imul edi, mx2[edx+ebx*4]
add esi, edi

pop edx
mov mx3[edx+ebx*4], esi

jmp up3
jtb_up2:
push eax
mov edx, eax
imul edx, edx, P*4
invoke printf, SADD("%2d "), dword ptr mx3[edx+ebx*4]
pop eax

jmp up2
jtb_up1:
invoke putchar, 10

jmp up1
over:
invoke system, SADD("pause")
invoke ExitProcess, 0
end start

现学现卖,用WINDLX写的,简单点了,而且你主要是要观察流水线操作:

.data
mx1: .word 1,2,3,4,5,6
mx2: .word 1,2,3,4,5,6
mx3: .word 0,0,0,0,0,0 ; mx3 = mx1 * mx2

.text
.global main
xor r0, r0, r0
add r1, r0, 0
add r3, r0, 0
loop:
lw r4, mx1(r3)
lw r5, mx2(r3)
multu r6, r4, r5
sw mx3(r3), r6
add r3, r3, 4
add r1, r1, 1
sgeui r2, r1, 6
bnez r2, finish
j loop
finish:
trap 0本回答被提问者采纳

用汇编语言编写一个程序
使用汇编语言编写程序实现用户登录功能,包含用户名和密码输入与验证。程序通过结构类型定义用户名和密码信息,并实现输出、获取光标位置、设置光标位置、窗口上滚、输入密码以及用户输入错误处理等功能。主要步骤包括初始化环境、输入用户名、验证用户名、输入密码、验证密码、显示欢迎信息和结束程序。程序首先初始...

ARM汇编语言简单编程问题
1.用ARM汇编指令实现的C赋值语句:x=(a+b)-c,在进行运算之前,代码必须先把a、b、c的值装入到寄存器,运算结束后,还要把x的值存回存储器中。2用ARM汇编指令实现的C语句:z=(a<<2)|(b&15)。3在ARM汇编指令中实现下面条件转移语句:if(a...

用汇编语言编程:从键盘输入一行字符,统计字母、空格、数字、其他字符的...
PARS DB 100 ;准备接收100个字符.NNN DB ? ;用于存放实际输入的个数.III DB 100 DUP(?) ;100字节的空间.N_N DB ?S_N DB ?C_N DB ?O_N DB ?MESG1 DB 13, 10, 'Input STR : $ ' ;用于提示.MES_C DB 13, 10, 'Char N is : $ ...

汇编语言简单的标注 急急急~~~!!!
XIANSHI: ;设定显示程序 MOV P1,33H ;让第一个数码管显示H或L MOV P3,#00000000B;P3清零 CALL DLIMS;调用了程序DLIMS MOV A,32H;32H单元内容(数据在表中的偏移量)送A MOV DPTR,#TAB;数据表头地址送DPTR MOVC A,@A+DPTR;取数据 MOV P1,A;数据由P1口输出 MOV P3,#00000001B...

【微机原理】1.汇编语言程序设计(1)
实际上,理解内存指令执行方式是关键,就像学习高级编程语言一样。让我们以一个简单实例来揭开汇编的神秘面纱:给定存储在内存中的a和b,我们要让CPU执行加法并将结果存入c,最后输出c的值。这与C语言中的变量声明和操作有着显著区别,但本质是相同的:处理数据和指令。基础定义: 在汇编语言中,我们使用...

简单的汇编语言程序设计!加急!
SUBB A, 31H ;(30H)-(31H)JC EXIT ;不够减转移 MOV 32H, 31H ;否则31H才是小数 EXIT:END --- 2. 将片内RAM单元中 30H~37H 的数据送到片外RAM的 40H~47H。MOV R0, #30H MOV R1, #40H MOV R2, #8 LOOP:MOV A, @R0 MOVX @R1, A INC R0 INC R1...

简单的单片机的汇编语言编程的程序翻译
0,JNB P3.0,MOV P1,#0FFH \/\/熄灭算所有的灯 ACALL DELAY AJMP XH \/\/跳转到标号XH NOP NOP \/\/空语句,一个指令周期延时 NOP NOP DELAY: MOV R0,#080H \/\/延时子程序 D1: MOV R1,#0FAH D2: DJNZ R1,D2 \/\/r1为0,跳转到下一条指令 DJNZ R0,D1 RET END ...

汇编语言编程序
程序如下,我是按在386上编的。.model small .386 .dosseg .stack 1024 .data ;DATA1 dd 81234567h DATA1 dd 7fffffffh; 最大正数 DATA2 dd 80000000h; 最小负数 ;DATA2 dd 1234;SUM dd ?.code .startup mov eax, DATA1 add eax, DATA2 jo OverFlow jmp Done OverFlow:cmp DATA1...

汇编语言编程
汇编语言编程 用汇编语言实现:从屏幕上输入20个学生的学号(6位),成绩(十进制),要求对学生学习成绩进行排序并显示学号和和其成绩,并统计90以上,80~89,70~79,60~69,60以下学生个数,平均... 用汇编语言实现 :从屏幕上输入20个学生的学号(6位),成绩(十进制),要求对学生学习成绩进行排序并显示学号和和其成绩,...

用汇编语言编程
NEXT1:MOV [DI],AL;不是大写字符的不变,存入BUF4,若是大写字符,则变为小写字符再存 ;入BUF4对应单元 INC DI INC SI LOOP BIANHUAN RET PROC3 ENDP PROC4 PROC NEAR ;输出一个回车换行 MOV CX,2 MOV DI,OFFSET BUF3 SHUCHU:MOV DL,[DI]MOV AH,02H INT 21H INC DI LOOP SHUCHU...

相似回答