mju126 发表于 2019-4-2 11:02:24

汇编小游戏

我这有一个汇编游戏,代码300+行,怎么多加一点呀,就是凑行数就行,效果不重要。需要带上注释!

RIXO 发表于 2019-4-2 11:11:02

这多简单啊,你写个脚本,让他隔几行就把几个寄存器的值相互颠倒一下,再互相交换一下,然后又用交换的值干原来的事情,外加上没事就异或一下,用的时候再异或回来。注释就写加密

mju126 发表于 2019-4-2 11:20:36

RIXO 发表于 2019-4-2 11:11
这多简单啊,你写个脚本,让他隔几行就把几个寄存器的值相互颠倒一下,再互相交换一下,然后又用交换的值干 ...

老师不让留空行,去完空行估计就350行,要求600行,我刚问了下别人,大佬说可惜加界面效果,想找一些可以直接用的,主要就是凑行数,效果不要求

RIXO 发表于 2019-4-2 11:35:22

mju126 发表于 2019-4-2 11:20
老师不让留空行,去完空行估计就350行,要求600行,我刚问了下别人,大佬说可惜加界面效果,想找一些可以 ...

没有留空行啊,你把a给b,再把b给c,再把c给a,有问题吗?

RIXO 发表于 2019-4-2 11:36:30

mju126 发表于 2019-4-2 11:20
老师不让留空行,去完空行估计就350行,要求600行,我刚问了下别人,大佬说可惜加界面效果,想找一些可以 ...

你要叫我直接用,我怎么知道你定义的变量叫a还是叫b还是叫c啊

人造人 发表于 2019-4-2 21:40:17

mju126 发表于 2019-4-2 11:20
老师不让留空行,去完空行估计就350行,要求600行,我刚问了下别人,大佬说可惜加界面效果,想找一些可以 ...

不是要去除全部空格600行吗?
没问题,来个暴力一点的,添加600个nop
每一个nop占一行

nop指令可不是空格,不能去掉
^_^

另外,这是什么无理取闹的要求

人造人 发表于 2019-4-2 21:44:59

还有,这600个nop都不需要一个一个输入的,直接运行这个程序,复制输出结果就行

对于学校老师布置的这类问题,我什么也不想说,如果你想应付过去,那就应付过去吧

#include <iostream>

int main()
{
        for(size_t i = 0; i < 600; ++i)
                std::cout << "\t" << "nop" << std::endl;
        return 0;
}

李兵 发表于 2019-4-4 11:17:16

人造人 发表于 2019-4-2 21:44
还有,这600个nop都不需要一个一个输入的,直接运行这个程序,复制输出结果就行

对于学校老师布置的这类 ...

人才就是你这样的{:7_146:}

xiaokwm 发表于 2019-4-4 17:29:38

这多简单啊,你写个脚本,让他隔几行就把几个寄存器的值相互颠倒一下,再互相交换一下,然后又用交换的值干原来的事情,外加上没事就异或一下,用的时候再异或回来。注释就写加密

mju126 发表于 2019-4-7 17:13:45

DATA SEGMENT
BUFF1 DB '****************************************'
DB ' '
DB' Welcome you to run this game! '                                                ;初始界面
DB ' '
DB '****************************************','$'
N DB ?
JIFEN DB ?
DIPAI DB ?
PAIDIAN DB ?
QH1 DB ?
QH2 DB ?
SH DB '10','$'
JK DB 'PEI LV(10 OR 5)?','$'
MESSAGE0 DB 'DOU YOU WANT TO MORE?','$'                                                ;开始标语
MESSAGE1 DB '************YOU WIN!************','$'                        ;成功显示
MESSAGE2 DB '************YOU LOSE!***********','$'                        ;失败显示
MESSAGE3 DB 'Go on or not?','$'                                                                ;结束语言
MESSAGE4 DB 'This is dipai:','$'
MESSAGE5 DB ' This is JIFEN:','$'
MESSAGE6 DB '******THE GAME IS OVER !******','$'                        ;结束语言
MESSAGE7 DB 0AH, 0DH,'This is your PAIDIAN:','$'
DATA ENDS
STACK SEGMENT                                                                                                 ;构造栈
DW 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: PUSH DS                                                                                                 ;将ds寄存器压入栈
MOV AX,0                                                                                                       ;将0传入ax寄存器
PUSH AX                                                                                                         ;将ax压入栈
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
BEGIN: CALL XX0                                                                                         ;h240输出字符xx0
A1:
MOV JIFEN,50                                                                                              ;定义积分
A2:
CALL RAND                                                                                                      ;调用函数h124
MOV DIPAI,BL                                                                                                 ;产生随机数为底牌
CALL CHULI                                                                                                         ;调用函数h315,判断牌点是否大于在10
MOV QH1,BL                                                                                                         ;产生电脑底牌
JB1: CALL XX                                                                                                 ;h233,输出字符串
MOV AH,0                                                                                                         ;从键盘读取字符,ah/al=扫描码
INT 16H                                                                                                         ;中断
CMP AL,59H                                                                                                         ; 相减,只影响标志位zf,59h表示字母y
JE JI                                                                                                                 ; 若是y则跳转h58
CALL XX21                                                                                                         ;函数调用h339
MOV N,5
JMP A3                                                                                                                 ;无条件跳转
JI: MOV N,10
CALL XX20                                                                                                         ;h344,输出字母y
A3:
CALL RAND                                                                                                      ;h124,产生一个随机数
CALL XX19 ;h324,                                                                                        ;输出message7
MOV PAIDIAN,BL                                                                                                 ;再发一张牌
CALL DISP0                                                                                                         ;h154 判断牌点具体数值
CALL CHULI                                                                                                         ;307判断牌点是否大于10
MOV QH2,BL                                                                                                         ;产生底牌
CALL XX4                                                                                                         ;h252输出message0
A4:
MOV AH,0                                                                                                   ;从键盘读字符,ah/al=扫描码
INT 16H
CMP AL,4EH
JE HC                                                                                                                 ;4e表示字母n,相等跳转
CMP AL,59H
JE A4                                                                                                                 ;59h表示y,是y就跳转
A5:
CALL RAND                                                                                                      ;h129产生一个牌点
CALL XX19                                                                                                         ;输出字符串message7
MOV PAIDIAN,BL                                                                                                 ;牌点
CALL DISP0                                                                                                         ;判断具体牌点
CALL CHULI                                                                                                         ;h321判断是否大于10
A6:
ADC QH2,BL                                                                                                      ;实现加法,并记录是否进位
A7:
CMP QH2,21
JA A14                                                                                                                 ;判断牌点是否大于21点
CALL XX4                                                                                                         ;h268输入字符message0
A8:
JMP A4                                                                                                              ;输入
ZZ: CALL XX0                                                                                                 ;h248,置光标
JMP A2                                                                                                                 ;重新发牌
HC: CALL RETURN                                                                                         ;回车换行
A9:
MOV AL,QH2 ;
CMP QH1,AL                                                                                                         ;判断游戏者与电脑点数大小
JA A14                                                                                                                 ;h109,判断若电脑点数大,跳转
A10:
CALL RAND
MOV PAIDIAN,BL                                                                                                 ;记录牌点
CALL DISP0                                                                                                         ;判断牌点是否大于10
CALL CHULI                                                                                                         ;判断具体牌点
A11:
ADC QH1,BL                                                                                                 ;牌点相加,与21比较
A12:
CMP QH1,21                                                                                                  ;若牌点大于21
JA A15                                                                                                                 ;输出游戏结束,游戏者赢
A13:
JMP A9                                                      ;否则跳转a9,与电脑比大小
A14:
CALL XX14                                                                                                      ;h280输出message2
CALL JIAN                                                                                                         ;h226,记录积分
CMP JIFEN,10                                                                                                 ;若积分不大于10分,跳转,游戏结束
JB A18
JMP A16                                                                                                         ;若积分大于10,跳转,message4
A15:
CALL XX15                                                                                                         ;输出游戏结果,游戏者赢
CALL JIA ;
A16:
CALL XX16                                                                                                      ;输出牌点大小
MOV AL,DIPAI
MOV PAIDIAN,AL
CALL DISP0                                                                                                         ;判断大小
CALL DISP1 ;
A17:
CALL XX17
AG: MOV AH,0                                                                                                 ;从键盘输入
INT 16H
CMP AL,59h
JE ZZ                                                                                                                 ;相等跳转
CMP AL,4EH
JE A18                                                                                                                 ;相等跳转        
JNE AG                                                                                                                 ;不相等跳转
A18:
CALL XX18                                                                                                      ;输出
MOV AH,4CH
INT 21H
RAND PROC                                                                                                         ;随机函数
PUSH CX
PUSH DX
PUSH AX
STI                                                                                                                 ;中断标志置1指令 使 IF = 1
MOV CX,0FFFFH
YS: DEC CX                                                                                                       ;自减相当于循环
JNE YS                                                                                                                 ; 不等于零跳转
MOV AH,0                                                                                                         ;读当前时钟值
INT 1AH                                                                                                         ;中断
MOV AX,DX
AND AH,3                                                                                                         ;求和
MOV DL,13
DIV DL                                                                                                                 ;ax除以dl中的值 商放al 余数放ah
MOV BL,AH
ADC BL,1                                                                                                         ;相加,涉及进位cf
POP AX
POP DX
POP CX
RET
RAND ENDP
DISP0 PROC
CALL SPACE                                                                                                         ;h312,输出空格
CA
LL SPACE                                                                                                         ;h312,输出空格
CALL SPACE                                                                                                         ;h312,输出空格
MOV AL,PAIDIAN
CMP AL,9
JA OTHER                                                                                                         ; 比较,大于9跳转
CMP AL,1
JE A                                                                                                                 ;底牌al等于1,跳转
ADD AL,30H                                                                                                         ;相加
T: MOV DL,AL
MOV AH,2                                                                                                         ;显示输出,dl=字符串
INT 21H
RET
OTHER: CMP AL,10
JE SHI                                                                                                                 ;h182等于10的时候跳转
CMP AL,11
JE J                                                                                                                 ;等于11的时候跳转
CMP AL,12
JE Q                                                                                                                 ;等于12的时候跳转
MOV AL,4BH
JMP T                                                                                                                 ;4bh表示字母k
J: MOV AL,4AH
JMP T                                                                                                                 ;4ah表示字母j
Q: MOV AL,51H
JMP T                                                                                                                 ;51h表示字母q
A: MOV AL,41H
JMP T                                                                                                                 ;41h表示字母a
SHI: LEA DX,SH
MOV AH,09H                                                                                                         ;显示字符串,ds:dx=串地址,
INT 21H
RET
DISP0 ENDP
DISP1 PROC                                                                                                         ;求出现在积分
LEA DX,MESSAGE5
MOV AH,9                                                                                                         ;输出字符串,输出积分,dx:ds=串地址
INT 21H
MOV AL,JIFEN                                                                                                 ;积分放到al
CMP AL,100
JB MM                                                                                                                 ;若积分不足100,跳转
MOV CL,100
CBW                                                                                                                 ;将AL的最高有效位D7扩展至AH
DIV CL                                                                                                                 ;ax除以cl中的值 商放al 余数放ah
MOV BL,AH ;
OR AL,30H                                                                                                         ;或
MOV DL,AL
MOV AH,2                                                                                                         ;显示输出
INT 21H        
MOV AL,BL
MM: MOV CL,10
CBW                                                                                                                 ;将AL的最高有效位扩展至AH
DIV CL                                                                                                                 ;ax除以cl,商放ah,余放al
OR AL,30H                                                                                                       ;或运算,放在al
MOV DL,AL
MOV AH,2                                                                                                         ;显示输出,dl=输出字符,
INT 21H
MOV DL,30H                                                                                                       ;显示输出,dl=输出字符,30h表示为‘0’
MOV AH,2
INT 21H
RET
DISP1 ENDP
JIAN PROC                                                                                                         ;扣分惩罚
CMP N,10                                                                                                         ;若n大于10,跳转
JA X
SBB JIFEN,10                                                                                                 ;扣积分10分,且记录借位
JMP TU1 ;
X: SBB JIFEN,20                                                                                         ;扣积分20分,且记录借位
TU1: RET
JIAN ENDP
JIA PROC                                                                                                         ;积分奖励
CMP N,10
JA Y                                                                                                                 ;若牌点大于10,加20积分
ADC JIFEN,10                                                                                                 ;奖励积分,并实现进位
JMP TU                                                                                                               ;无条件跳转
Y: ADC JIFEN,20
TU: RET
JIA ENDP
XX PROC                                                                                                         ;输出字符串jk
LEA DX,JK
MOV AH,9
INT 21H
RET
XX ENDP
XX0
PROC
MOV AX,0600H                                                                                               ;当前显示页上卷
MOV CX,0000H                                                                                                 ;定义下卷窗口左上角坐标
MOV DX,184FH                                                                                                 ;定义下卷窗口又下角坐标
MOV BH,07H                                                                                                         ;填充字符属性
INT 10H
MOV AH,02H                                                                                                       ;置光标
MOV DH,5                                                                                                         ;第五行
MOV DL,15                                                                                                       ;第十五列
MOV BH,00H                                                                                                         ;填充字符属性
INT 10H
LEA DX,BUFF1
MOV AH,09H                                                                                                         ;显示字符串buff1
INT 21H
CALL RETURN                                                                                                 ;回车换行
RET
XX0 ENDP
XX4 PROC
CALL RETURN                                                                                                 ;回车换行
LEA DX,MESSAGE0                                                                                               ;输出字符串message0
MOV AH,09
INT 21H
RET
XX4 ENDP
XX14 PROC
CALL RETURN                                                                                                       ;回车换行
LEA DX,MESSAGE2                                                                                               ;输出字符串message2
MOV AH,9
INT 21H
RET
XX14 ENDP
XX15 PROC
CALL RETURN                                                                                                       ;换行回车
LEA DX,MESSAGE1                                                                                         ;输出字符串message1
MOV AH,9
INT 21H
RET
XX15 ENDP
XX16 PROC
CALL RETURN                                                                                                 ;回车换行
lea dx,MESSAGE4                                                                                         ;输出字符串message4
MOV AH,9
INT 21H
RET
XX16 ENDP
XX17 PROC       
CALL RETURN                                                                                                 ;回车换行
LEA DX,MESSAGE3                                                                                         ;输出字符串message3
MOV AH,9
INT 21H
CALL RETURN                                                                                                 ;回车换行
RET
XX17 ENDP
XX18 PROC                                                                                                         ;输出字符串message6
LEA DX,MESSAGE6
MOV AH,9
INT 21H
RET               
XX18 ENDP
SPACE PROC                                                                                                         ;输出空格
MOV DL,20H                                                                                                         ;dl=输出字符,20h表示为空格
MOV AH,2                                                                                                         ;显示输出
INT 21H                                                                                                         ;中断
RET
SPACE ENDP
CHULI PROC                                                                                                         ;判断是否大于10
CMP BX,10                                                                                                       ;相减,影响标志位
JB D                                                                                                                 ;低于跳转
MOV BX,10
D: ADD BX,0
RET
CHULI ENDP
RETURN PROC                                                                                                       ;换行
MOV AH,2                                                                                                       ;显示输出,dl=字符
MOV DL,0AH                                                                                                         ;0a表示lf(换行)
INT 21H
MOV DL,0DH                                                                                                         ;显示字符串dl=字符,0d表示cr(回车)
INT 21H
RET
RETURN ENDP
XX19 PROC                                                                                                       ;输出message7
LEA DX,MESSAGE7                                                                                               ;将message7地址给dx
MOV AH,9                                                                                                         ;显示字符串,ds:dx=串地址,
INT 21H                                                                                                         ;中断
RET
XX19 ENDP
XX20 PROC
CALL SPACE                                                                                                         ;输出空格键
MOV DL,59H
MOV AH,2                                                                                                         ;显示输出字符串dl,59h表示为字母y
INT 21H
CALL SPACE                                                                                                         ;输出字符串空格
RET
XX20 ENDP
XX21 PROC
CALL SPACE                                                                                                       ;输出字符串空格4e,表示为字母n
MOV DL,4EH
MOV AH,2                                                                                                         ;显示输出,dl=输出字符
INT 21H
CALL SPACE                                                                                                         ;输出字符串空格
RET
XX21 ENDP
RET
CODE ENDS
END START                                                                                                        ;结束
页: [1]
查看完整版本: 汇编小游戏