
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系统数控车床如何使用座标偏移,用什么指令调用子程序格式又是什么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)