关于汇编语言矩阵

关于汇编语言矩阵,第1张

370行的程序,慢慢看吧。

; 生成并显示NxN顺时针螺旋矩阵(N=2~15)

; 运行和结束程序

; 1、程序运行后,提示输入矩阵宽度(2~15范围的数)。直接回车,则结束程序;输足两位数,自动结束输入;

; 不足两位数,需回车结束输入。

; 2、程序判断矩阵宽度的有效性,若超出有效宽度,则重新输入

; 3、显示指定宽度的顺时针螺旋矩阵

; 4、重复第1步,直至满足程序结束条件。

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

Code Segment

Assume CS:Code,DS:Code

CR equ 000DH

LF equ 000AH

KBBack equ 0008H

; -------------------------------------

; 功能:显示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在数据段)

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

; -------------------------------------

; 功能:输出一个字符

; 入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr Endp

; -------------------------------------

; 功能:输出回车换行

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

; -------------------------------------

; 功能:取光标位置

; 入口:无

; 出口:DH=行号,DL=列号

GetCursor Proc Near

PUSH AX

PUSH BX

PUSH CX

PUSH DX

XOR BX,BX

MOV AH,3

INT 10H

MOV Cursor_Row,DH

MOV Cursor_Col,DL

POP DX

POP CX

POP BX

POP AX

RET

Cursor_Row DB

Cursor_Col DB

GetCursor EndP

; -------------------------------------

; 功能:置光标位置

; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)

SetCursor Proc Near

PUSH DX

PUSH CX

PUSH BX

PUSH AX

MOV DH,Cursor_Row

MOV DL,Cursor_Col

XOR BX,BX

MOV AH,2

INT 10H

POP AX

POP BX

POP CX

POP DX

RET

SetCursor EndP

; -------------------------------------

; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。

; 输足N位的,自动结束输入;不足N位的,回车结束输入。

; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536

; 约定:直接回车,视为数字0

; 入口:@@Digits=数字位数;di=保存输入的数字首地址

; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。

; 出口:转换后的二进制数保存在di所指的单元

Input_Digit Proc Near

push dx

push cx

push bx

push di

lea di,@@Save_Tmp

push di

cld

mov cl,@@Digits

xor ch,ch

push cx

@@Input: call GetCursor ;取光标位置

mov ah,1 ;从键盘接受一个字符

int 21h

cmp al,CR ;若键入的是回车,已经键入的数字不足N位

jz @@ASC_Dec ;转去处理已经键入的数字

cmp al,KBBack

jz @@KB_Back ;若是回空键,重新输入

cmp al,'0'

jb @@KBBack ;若低于数字'0',重新输入

cmp al,'9'

ja @@KBBack ;若高于数字'9',重新输入

jmp @@Save_Dig

@@KB_Back: dec Cursor_Col

inc cx

dec di

@@KBBack: call SetCursor ;置光标位置

jmp @@Input

@@Save_Dig: and al,0fh ;转换成二进制数

stosb ;保存

loop @@Input ;接受下一个数字

@@ASC_Dec: mov ax,cx

pop cx

pop si

sub cx,ax ;实际输入的数字位数

xor bp,bp

xor dx,dx

xor ax,ax

jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理

dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数

jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数

mov bx,10

@@Mul_Ten: lodsb

cbw

add ax,bp

mul bx

mov bp,ax

loop @@Mul_Ten

@@One_Digit: lodsb

cbw

add ax,bp

@@Save_Ret: pop di

cmp @@Type_Data,'B' ;字节类型?

jz $+5

stosw

jmp $+3

stosb

pop bx

pop cx

pop dx

ret

@@Digits db ;十进制数字位数

@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型

@@Save_Tmp db 16 dup()

Input_Digit EndP

; -------------------------------------

; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示

; 入口:AL=二进制数

; 出口:AX=转换后的ASCII码数字

AL_ASCII Proc Near

push bx

mov bl,100

xor ah,ah

div bl

or al,30h

mov bh,30h

cmp al,30h

jnz $+6

mov al,20h

mov bh,al

mov dl,al

call Output_Chr ;输出一个字符

mov bl,10

mov al,ah

xor ah,ah

div bl

or ax,3030h

cmp al,30h

jnz $+4

mov al,bh

mov dl,al

call Output_Chr ;输出一个字符

mov dl,ah

call Output_Chr ;输出一个字符

pop bx

ret

AL_ASCII EndP

; -------------------------------------

; 某行元素向右方向赋值

Right_Arry Proc Near

mov al,Row_Range ;取最小行号

mul Matrix_Width ;矩阵宽度

mov si,ax

lea di,Buffer[si] ;本行第一个元素地址

mov cx,WORD PTR Col_Range ;取列号范围

mov al,cl

sub ch,cl ;最大列号-最小列号

inc ch ;本行未赋值元素个数

xor cl,cl

xchg ch,cl

xor ah,ah

add di,ax ;本行第一个未赋值元素地址

mov al,Value_Current ;取当前元素数值

cld

@@Right_Arry: stosb ;给当前元素赋值

inc al ;下一个元素数值

loop @@Right_Arry

inc Row_Range ;最小行号增1

ret

Right_Arry Endp

; -------------------------------------

; 某列元素向下方向赋值

Down_Arry Proc Near

mov ax,WORD PTR Row_Range ;取行号范围

mov cx,ax

mov bl,Matrix_Width ;矩阵宽度

xor bh,bh

mov bp,bx

mul bl

mov si,ax

lea di,Buffer[si] ;本行第一个元素地址

mov al,Col_Range[1] ;取最大列号

xor ah,ah

add di,ax ;本列第一个未赋值元素地址

sub ch,cl ;最大行号-最小行号

inc ch ;本列未赋值元素个数

xor cl,cl

xchg ch,cl

mov al,Value_Current ;取当前元素数值

@@Down_Arry: mov [di],al ;给当前元素赋值

add di,bp ;下一个元素地址

inc al ;下一个元素数值

loop @@Down_Arry

dec Col_Range[1] ;最大列号减1

ret

Down_Arry Endp

; -------------------------------------

; 某行元素向左方向赋值

Left_Arry Proc Near

mov al,Row_Range[1] ;取最大行号

mul Matrix_Width ;矩阵宽度

mov si,ax

lea di,Buffer[si] ;本行第一个元素地址

mov cx,WORD PTR Col_Range ;取列号范围

mov al,ch

sub ch,cl ;最大列号-最小列号

inc ch ;本行未赋值元素个数

xor cl,cl

xchg ch,cl

xor ah,ah

add di,ax ;本行第一个未赋值元素地址

mov al,Value_Current ;取当前元素数值

std

@@Left_Arry: stosb ;给当前元素赋值

inc al ;下一个元素数值

loop @@Left_Arry

dec Row_Range[1] ;最大行号减1

ret

Left_Arry Endp

; -------------------------------------

; 某列元素向上方向赋值

Up_Arry Proc Near

mov ax,WORD PTR Row_Range ;取行号范围

mov cx,ax

mov bl,Matrix_Width ;矩阵宽度

xor bh,bh

mov bp,bx

xchg ah,al

mul bl

mov si,ax

lea di,Buffer[si] ;本行第一个元素地址

mov al,Col_Range ;取最小列号

xor ah,ah

add di,ax ;本列第一个未赋值元素地址

sub ch,cl ;最大行号-最小行号

inc ch ;本列未赋值元素个数

xor cl,cl

xchg ch,cl

mov al,Value_Current ;取当前元素数值

@@Up_Arry: mov [di],al ;给当前元素赋值

sub di,bp ;下一个元素地址

inc al ;下一个元素数值

loop @@Up_Arry

inc Col_Range ;最小列号加1

ret

Up_Arry Endp

; -------------------------------------

Value_Current db 1 ;将要赋值的元素值

Max_Value db ;矩阵元素最大值

Matrix_Width db ;矩阵宽度

Row_Range db , ;行号范围

Col_Range db , ;列号范围

Subroutine dw Right_Arry,Down_Arry,Left_Arry,Up_Arry ;子程序地址

Prompt_Str db 'Please input a number(2-15): $'

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

; -------------------------------------

Start: push cs

pop ds

push cs

pop es

@@Prompt_Input:Output Prompt_Str ;提示输入螺旋矩阵宽度

lea di,Matrix_Width ;保存输入的数字地址

mov @@Digits,2 ;数字位数

mov @@Type_Data,'B' ;保存的数据类型,B=字节类型,W=字类型。

@@Input_Num: call Input_Digit ;键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。输足N位的,自动结束输入;不足N位的,回车结束输入。

mov al,Matrix_Width ;取矩阵宽度

test al,al ;=0

jz Exit_Proc ;直接回车或输入的数值为0,结束程序

cmp al,2 ;<2

jb @@Prompt_Input ;超出有效数字范围,重新输入

cmp al,15 ;>15

ja @@Prompt_Input ;超出有效数字范围,重新输入

dec ax

xchg ah,al

mov WORD PTR Row_Range,ax ;保存行号范围

mov WORD PTR Col_Range,ax ;保存列号范围

inc ah

mov al,ah

mul ah ;N的平方

mov Max_Value,al ;保存矩阵元素最大值

xor bx,bx ;第一个子程序地址偏移量

mov al,1 ;将要赋值的元素值

@@Cwise_spiral:mov Value_Current,al ;将要赋值的元素值

cmp al,Max_Value ;将要赋值的元素值>矩阵元素最大值

ja @@List_Matrix ;转去显示矩阵

push bx

call Subroutine[bx] ;调用顺时针螺旋赋值子程序

pop bx

cmp bl,6

jz $+6

inc bx

inc bx

jmp @@Cwise_spiral ;顺时针螺旋

xor bx,bx

jmp @@Cwise_spiral ;顺时针螺旋

@@List_Matrix: call Output_CTLF ;显示一个回车、换行

call Output_CTLF

lea si,Buffer ;矩阵数据区地址

mov cl,Matrix_Width ;矩阵宽度

xor ch,ch

mov bp,cx

cld

@@Line_Disp: push cx

mov cx,bp

@@Column_Disp: lodsb ;读出一个元素

call AL_ASCII ;把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示

cmp cx,1

jz $+7

mov dl,20h

call Output_Chr ;输出一个字符

loop @@Column_Disp ;下一列

call Output_CTLF

pop cx

loop @@Line_Disp ;下一行

call Output_CTLF

jmp @@Prompt_Input

; -------------------------------------

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

mov ah,1

int 21h

mov ah,4ch ;结束程序

int 21h

Buffer: ;数据缓冲区

Code ENDS

END Start ;编译到此结束

版本 2

子程序 _按钮1_被单击

局部变量 地址, 整数型

局部变量 偏移1, 整数型

局部变量 偏移2, 整数型

局部变量 偏移3, 整数型

局部变量 偏移4, 整数型

局部变量 整数数据, 整数型

局部变量 字节数据, 字节型

偏移1 = 4

偏移2 = 4

偏移3 = 4

偏移4 = 十六到十 (编辑框1内容)

地址 = 读整型内存 (十六到十 (“00123456”) + 偏移1, 4)

地址 = 读整型内存 (地址 + 偏移2, 4)

地址 = 读整型内存 (地址 + 偏移3, 4)

地址 = 读整型内存 (地址 + 偏移4, 4)

写整型内存 (地址, 整数数据)

写字节内存 (地址, 字节数据)

子程序 写整型内存, 逻辑型, , 写入四字节数据(成功返回真,失败返回假) [斩月]

参数 地址, 整数型, , 内存地址

参数 变量, 整数型, , 写入数据

局部变量 *** 作句柄, 整数型

局部变量 是否成功, 整数型

*** 作句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 0, PID)

是否成功 = _写整型内存 ( *** 作句柄, 地址, 变量, 4, 0)

CloseHandle ( *** 作句柄)

如果 (是否成功 = 0)

返回 (假)

否则

返回 (真)

如果结束

子程序 写字节内存, 逻辑型, , 写入四字节数据(成功返回真,失败返回假) [斩月]

参数 地址, 整数型, , 内存地址

参数 变量, 字节型, , 写入数据

局部变量 *** 作句柄, 整数型

局部变量 是否成功, 整数型

*** 作句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 0, PID)

a = _写整型内存 ( *** 作句柄, 地址, 变量, 1, 0)

CloseHandle ( *** 作句柄)

如果 (是否成功 = 0)

返回 (假)

否则

返回 (真)

如果结束

凯达国立精机18Tc系统暂不支持坐标偏移,应为没有可偏移的坐标和指令。调用子程序用M98Pxxxxxx,和FANUC、GSK一样的。

1、格式:M98P------

2、意义:M98为调用子程序,P前两位是调用次数,后四位是调用程序名。

凯达系统不好用,编辑程序也很麻烦,不能复制,只能通过电脑复制。

1table有4个表目,每个指向一个子程序的偏移地址

2ah是8位寄存器(字节),用来传送子程序编号,对头

3add bx,bx是为了由子程序编号得到存放对应子程序的偏移地址的表目的偏移地址(有点拗口),可替换为shl bx,1

4add bx,bx怎么会得双字,顶多就17位,就是说可能溢出

5table[bx]是内存单元,对,寄存器相对寻址。他的宽度,要看环境。如另外一个 *** 作数或者word ptr table[bx]

多加分,少匿名,会有很多人答!

子程序写错了。G50是数控机床常用的整体偏移代码,主程序与子程序的代码是相辅的,主程序使用的是G50W,子程序是G50N,如果子程序使用G50W就会出错,出现这种情况更改子程序代码就可以了。

call

word

ptr

[]是段内调用,只是先把当前指令的下一条指令的ip压栈,然后将[]下的内容给ip,然后继续执行

在压栈时是sp=sp-2,ss:[sp]=压栈的ip值

call

dword

ptr

[]是段间调用,只是先把当前的cs压栈,然后将指令的下一条指令的ip压栈,然后将[]下的内容给ip,

[+2]的内容给cs,然后继续执行

这里是sp=sp-2;ss:[sp]=压栈的cs,然后sp=sp-2;ss:[sp]=压栈的ip

希望对你有用

以上就是关于关于汇编语言矩阵全部的内容,包括:关于汇编语言矩阵、易语言偏移问题、浙江凯达国立精机18TC系统数控车床如何使用座标偏移,用什么指令调用子程序格式又是什么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9391325.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存