x86汇编课程总结
程序员文章站
2024-03-02 11:56:28
...
第一次作业
1、改例题 降序 加“班号学号”水印
在debug下呈现结果 -> txt
2、显示第一题排序前后结果(16进制显示)
3、显示10进制结果
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
TABLE_LEN DW 16
TABLE DW 200,300,400,10,20,0,1,8
DW 41H,40,42H,50,60,0FFFFH,2,3
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA1,SS:STACK1
MAIN PROC FAR
MOV AX,STACK1
MOV SS,AX
MOV SP,STACK_BTM
MOV AX,DATA1
MOV DS,AX
LP1: MOV BX,1
MOV CX,TABLE_LEN
DEC CX
MOV SI,OFFSET TABLE
LP2: MOV AX,[SI]
CMP AX,[SI+2]
JAE CONTINUE
XCHG AX,[SI+2]
MOV [SI],AX
MOV BX,0
CONTINUE: ADD SI,2
LOOP LP2
CMP BX,1
JZ EXIT
JMP SHORT LP1
EXIT: CALL DISP_DATA
MOV AX,4C00H
INT 21H
MAIN ENDP
DISP_DATA: LEA SI,TABLE
MOV CX,TABLE_LEN
DL1: MOV AX,[SI]
CALL PRINT
ADD SI,2
LOOP DL1
RET
PRINT: MOV AX, [SI]
MOV BX, 10
PUSH CX
MOV CX, 0
ZH1: MOV DX, 0
DIV BX
ADD DL, '0'
PUSH DX
INC CX
CMP AX, 0
JNZ ZH1
MOV AH, 2
ZH2: POP DX
INT 21H
LOOP ZH2
MOV DL, ' '
INT 21H
POP CX
RET
CODE1 ENDS
END MAIN
运行结果截图:
(运行前)
(运行后)
第二次作业
1、 设计strcpy,考虑三种场景,显示复制前后的结果(可选:大于64K,四个小时)
STACK SEGMENT PARA STACK
STACK_AREA DW 100 DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK ENDS
DATA SEGMENT PARA
STR1 DB 'Test line1:Good morning!'
STR1_LEN DW $ - STR1
STR2 DB 'TEST LINE2'
STR2_LEN DW $ - STR2
BUFF DB 200 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,STACK
MOV SS,AX
MOV SP,STACK_BTM
MOV AX,DATA
MOV DS,AX
MOV ES,AX
XOR AX,AX
MOV SI,OFFSET STR1
MOV DI,OFFSET BUFF
CLD
MOV CX,STR1_LEN
COPY:
LODSB
STOSB
LOOP COPY
XOR AX,AX
MOV SI,OFFSET BUFF
MOV DI,OFFSET STR1
ADD DI,4
CLD
MOV CX,STR1_LEN
COPY_2:
LODSB
STOSB
LOOP COPY_2
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
运行结果截图:
(第一种)
(第二种)
(第三种)
2、 大小写转换
DATA SEGMENT
BUF DB 'Hello',13,10,'END$'
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
LEA BX,BUF
LA:
MOV DL,[BX]
CMP DL,'$'
JZ EXIT
CMP DL,'a'
JB K
CMP DL,'z'
JA K
SUB DL,20H
K: MOV [BX],DL
INC BX
JMP LA
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END MAIN
运行结果截图:
第三次作业:
上机题3
1、 编写综合程序,构成子程序表(函数表)
实现:十-> 十六,十六-> 十, 二 -> 十,乘除
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
MESG1 DB 'TEN TO SIXTEEN$'
MESG2 DB 'SIXTEEN TO TEN$'
MESG3 DB 'TWO TO TEN$'
MESG4 DB 'MULTIPLY$'
MESG5 DB 'DIVISION$'
MESG6 DB '1.TEN2SIXTEEN 2.SIXTEEN2TEN 3.TWO2TEN 4.MUL 5.DIV$'
FUNC DW 4 DUP(?)
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1, DS:DATA1, SS:STACK1, ES:DATA1
GETNUM MACRO
MOV AH, 1
INT 21H
SUB AL, 30H
XOR AH, AH
ENDM
NEWLINE MACRO
PUSH DX
PUSH AX
MOV DL, 0AH
MOV AH, 02H
INT 21H
POP AX
POP DX
ENDM
DISPSTR PROC
MOV AH, 09H
INT 21H
MOV DL, 0AH
MOV AH, 02H
INT 21H
RET
DISPSTR ENDP
DISPTEN PROC
PUSH BX
PUSH DX
PUSH CX
XOR CX, CX
MOV BX, 10
DISPTENLP: XOR DX, DX
DIV BX
ADD DX, 30H
PUSH DX
INC CX
CMP AX, 0
JE DISPTENLP2
JMP DISPTENLP
DISPTENLP2: POP DX
MOV AH, 2
INT 21H
LOOP DISPTENLP2
POP CX
POP DX
POP BX
RET
DISPTEN ENDP
DISPNUM PROC
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10H
MOV CX, 4
DISPNUMLP1: XOR DX, DX
DIV BX
CMP DL, 10
JAE DISPNUMIF
ADD DL, 30H
JMP DISPNUMCO
DISPNUMIF: ADD DL, 37H
DISPNUMCO: PUSH DX
LOOP DISPNUMLP1
MOV CX, 4
DISPNUMLP2: POP DX
MOV AH, 2
INT 21H
LOOP DISPNUMLP2
POP DX
POP CX
POP BX
RET
DISPNUM ENDP
GETSIXTNUM PROC
MOV AH, 1
INT 21H
CMP AL, 40H
JAE IFMORE
SUB AL, 30H
JMP OUTIF
IFMORE: SUB AL, 37H
OUTIF: XOR AH, AH
RET
GETSIXTNUM ENDP
GETTWO PROC
PUSH BX
XOR BX, BX
GETTWOLP: GETNUM
XOR AH, AH
CMP AL, 0F4H
JZ RETURN
SHL BX, 1
ADD BX, AX
JMP GETTWOLP
RETURN: MOV AX, BX
POP BX
RET
GETTWO ENDP
GETSIXT PROC
PUSH BX
PUSH CX
MOV CX, 4
XOR BX, BX
GETSIXTLP: CALL GETSIXTNUM
PUSH CX
MOV CL, 4
SHL BX, CL
ADD BX, AX
POP CX
LOOP GETSIXTLP
MOV AX, BX
POP CX
POP BX
RET
GETSIXT ENDP
GETTEN PROC
PUSH BX
PUSH CX
PUSH DX
MOV CX, 4
XOR BX, BX
MOV BX, 10
XOR DX, DX
GETTENLP: MOV AX, DX
MUL BL
MOV DX, AX
GETNUM
ADD DX, AX
LOOP GETTENLP
MOV AX, DX
POP DX
POP CX
POP BX
RET
GETTEN ENDP
MAIN PROC FAR
MOV AX, STACK1
MOV SS, AX
MOV SP, STACK_BTM
MOV AX, DATA1
MOV DS, AX
MOV ES, AX
MOV SI, OFFSET FUNC
MOV BX, OFFSET TEN2SIXTEEN
MOV [SI], BX
MOV BX, OFFSET SIXTEEN2TEN
MOV [SI+2], BX
MOV BX, OFFSET TWO2TEN
MOV [SI+4], BX
MOV BX, OFFSET MULTIPLY
MOV [SI+6], BX
MOV BX, OFFSET DIVISION
MOV [SI+8], BX
MAINLP: MOV DX, OFFSET MESG6
CALL DISPSTR
NEWLINE
GETNUM
NEWLINE
CMP AL, 0
JE EXIT
DEC AL
SHL AL, 1
MOV BL, AL
XOR BH, BH
CALL [SI+BX]
JMP MAINLP
EXIT: MOV AX, 4C00H
INT 21H
MAIN ENDP
TEN2SIXTEEN PROC
MOV DX, OFFSET MESG1
CALL DISPSTR
NEWLINE
CALL GETTEN
NEWLINE
CALL DISPNUM
NEWLINE
RET
TEN2SIXTEEN ENDP
SIXTEEN2TEN PROC
MOV DX, OFFSET MESG2
CALL DISPSTR
NEWLINE
CALL GETSIXT
NEWLINE
CALL DISPTEN
NEWLINE
RET
SIXTEEN2TEN ENDP
TWO2TEN PROC
MOV DX, OFFSET MESG3
CALL DISPSTR
NEWLINE
CALL GETTWO
NEWLINE
CALL DISPTEN
NEWLINE
RET
TWO2TEN ENDP
MULTIPLY PROC
MOV DX, OFFSET MESG4
CALL DISPSTR
NEWLINE
CALL GETSIXT
MOV BX, AX
NEWLINE
CALL GETSIXT
NEWLINE
XOR DX, DX
MUL BX
PUSH AX
MOV AX, DX
CALL DISPNUM
POP AX
CALL DISPNUM
NEWLINE
RET
MULTIPLY ENDP
DIVISION PROC
MOV DX, OFFSET MESG5
CALL DISPSTR
NEWLINE
CALL GETSIXT
PUSH AX
NEWLINE
CALL GETSIXT
NEWLINE
MOV BX, AX
POP AX
XOR DX, DX
DIV BX
CALL DISPNUM
NEWLINE
MOV AX, DX
CALL DISPNUM
NEWLINE
RET
DIVISION ENDP
CODE1 ENDS
END MAIN
运行结果截图:
2、 字符串,同上
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
MESG1 DB 'UPPER TO LOWER$'
MESG2 DB 'STRING CONCATENATION$'
MESG3 DB 'STRING SLICE$'
MESG4 DB 'STRING COPY$'
MESG5 DB 'STRING SEARCH$'
MESG DB '1.CONVERT 2.CONCATENATE 3.SLICE 4.COPY 5.SEARCH$'
MESGMAT1 DB 'MATCH!$'
MESGMAT0 DB 'NOT MATCH!$'
FUNC DW 7 DUP(?)
BUF DB 40H
LEN DB ?
STRING DB 40H DUP(?)
BUF2 DB 40H
LEN2 DB ?
STRING2 DB 40H DUP(?)
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1, DS:DATA1, ES:DATA1, SS:STACK1
GETNUM MACRO
MOV AH, 1
INT 21H
SUB AL, 30H
XOR AH, AH
ENDM
DISPSTR MACRO
MOV AH, 09H
INT 21H
ENDM
NEWLINE MACRO
PUSH DX
PUSH AX
MOV DL, 0AH
MOV AH, 02H
INT 21H
POP AX
POP DX
ENDM
GETSTR MACRO
PUSH AX
PUSH BX
PUSH SI
PUSH DX
MOV AH, 0AH
INT 21H
NEWLINE
POP SI
XOR BX, BX
MOV BL, [SI+1] ;LENGTH
MOV BYTE PTR [SI+BX+2], '$'
POP SI
POP BX
POP AX
ENDM
DISPNUM PROC
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10H
MOV CX, 4
DISPNUMLP1: XOR DX, DX
DIV BX
CMP DL, 10
JAE DISPNUMIF
ADD DL, 30H
JMP DISPNUMCO
DISPNUMIF: ADD DL, 37H
DISPNUMCO: PUSH DX
LOOP DISPNUMLP1
MOV CX, 4
DISPNUMLP2: POP DX
MOV AH, 2
INT 21H
LOOP DISPNUMLP2
POP DX
POP CX
POP BX
RET
DISPNUM ENDP
MAIN PROC FAR
MOV AX, STACK1
MOV SS, AX
MOV AX, DATA1
MOV DS, AX
MOV ES, AX
MOV SI, OFFSET FUNC
MOV BX, OFFSET CONV_FUNC
MOV [SI], BX
MOV BX, OFFSET CONCA_FUNC
MOV [SI+2], BX
MOV BX, OFFSET SLICE_FUNC
MOV [SI+4], BX
MOV BX, OFFSET COPY_FUNC
MOV [SI+6], BX
MOV BX, OFFSET SEARCH_FUNC
MOV [SI+8], BX
MOV DX, OFFSET MESG
DISPSTR
NEWLINE
GETNUM
NEWLINE
CMP AL, 0
JE EXIT
DEC AL
SHL AL, 1
MOV BL, AL
XOR BH, BH
CALL [SI+BX]
EXIT: MOV AX, 4C00H
INT 21H
MAIN ENDP
SEARCH_FUNC PROC
MOV DX, OFFSET BUF
GETSTR
MOV DX, OFFSET BUF2
GETSTR
MOV SI, OFFSET STRING
MOV DI, OFFSET STRING2
PUSH DI
PUSH SI
CALL SEARCH
CMP AX, 0
JZ NOFOUND
MOV DX, OFFSET MESGMAT1
DISPSTR
NEWLINE
JMP FDEND
NOFOUND: MOV DX, OFFSET MESGMAT0
DISPSTR
NEWLINE
FDEND: RET
SEARCH_FUNC ENDP
COPY_FUNC PROC
MOV DX, OFFSET BUF
GETSTR
NEWLINE
XOR DX, DX
MOV DL, LEN
INC DX
PUSH DX
MOV BX, OFFSET STRING
ADD BX, DX
DEC BX
PUSH BX
MOV BX, OFFSET STRING
PUSH BX
CALL COPY
MOV DX, OFFSET STRING
DISPSTR
RET
COPY_FUNC ENDP
SLICE_FUNC PROC
MOV DX, OFFSET BUF
GETSTR
NEWLINE
GETNUM
NEWLINE
MOV BX, AX
GETNUM
NEWLINE
MOV CX, AX
SUB CX, BX
MOV SI, OFFSET STRING
ADD SI, BX
CLD
SLICEFUNCLP: XOR AX, AX
LODSB
MOV DX, AX
MOV AH, 2
INT 21H
LOOP SLICEFUNCLP
RET
SLICE_FUNC ENDP
CONCA_FUNC PROC
MOV DX, OFFSET BUF
GETSTR
NEWLINE
MOV DX, OFFSET BUF2
GETSTR
NEWLINE
XOR DX, DX
MOV DL, LEN2
INC DX
PUSH DX
XOR DX, DX
MOV DL, LEN
MOV BX, OFFSET STRING
ADD BX, DX
PUSH BX
MOV DX, OFFSET STRING2
PUSH DX
CALL COPY
MOV DX, OFFSET STRING
DISPSTR
RET
CONCA_FUNC ENDP
CONV_FUNC PROC
MOV DX, OFFSET BUF
GETSTR
NEWLINE
MOV SI, DX
XOR BX, BX
MOV BL, [SI+1] ; LEN
PUSH BX
MOV DX, OFFSET STRING
PUSH DX
CALL CONVERT
MOV DX, OFFSET STRING
DISPSTR
NEWLINE
RET
CONV_FUNC ENDP
CONVERT PROC
PUSH BP
MOV BP, SP
PUSH DI
PUSH SI
PUSH DX
PUSH CX
MOV DI, [BP+4] ; DI IS STRING
MOV SI, DI
MOV CX, [BP+6] ; CX IS LEN
CLD
CONVERTLP: LODSB
CMP AL, 'A'
JB CONTINUE
CMP AL, 'Z'
JA CONTINUE
ADD AL, 20H
CONTINUE: STOSB
LOOP CONVERTLP
POP CX
POP DX
POP SI
POP DI
POP BP
RET 4
CONVERT ENDP
MATCH PROC
PUSH BP
MOV BP, SP
PUSH SI
PUSH DI
MOV SI, [BP+4] ; PATTEN STRING
MOV DI, [BP+6] ; MAIN STRING
CLD
MATCHLP: LODSB
CMP AL, '$'
JE MATL2
CMP AL, [DI]
JNE MATL1
INC DI
JMP MATCHLP
MATL1: MOV AX, 0
JMP MATOUT
MATL2: MOV AX, 1
JMP MATOUT
MATOUT: POP DI
POP SI
POP BP
RET 4
MATCH ENDP
COPY PROC
PUSH BP
MOV BP, SP
PUSH CX
PUSH SI
PUSH DI
MOV SI, [BP+4]
MOV DI, [BP+6]
MOV CX, [BP+8]
CMP SI, DI
JAE FOWARD
ADD SI, CX
CMP SI, DI
JBE FOWARD
DEC SI
ADD DI, CX
DEC DI
STD
REP MOVSB
JMP COPYOUT
FOWARD: MOV SI, [BP+4]
CLD
REP MOVSB
COPYOUT: POP DI
POP SI
POP CX
POP BP
RET 6
COPY ENDP
SEARCH PROC
PUSH BP
MOV BP, SP
PUSH SI
PUSH DI
MOV SI, [BP+4]
MOV DI, [BP+6]
SEARLP: PUSH SI
PUSH DI
CALL MATCH
CMP AX, 1
JZ FINDR
INC SI
MOV AL, [SI]
CMP AX, 24H
JZ NOR
LOOP SEARLP
FINDR: MOV AX, SI
JMP SEARR
NOR: MOV AX, 0
SEARR: POP DI
POP SI
POP BP
RET 4
SEARCH ENDP
CODE1 ENDS
END MAIN
运行结果截图:
第四次作业:
1、 求n!,n = 5(6、7、8), n=3时 Debug下截屏,说明堆栈内存图
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1, ES:DATA1, DS:DATA1, SS:STACK1
GETNUM MACRO
MOV AH, 1
INT 21H
SUB AL, 30H
XOR AH, AH
ENDM
DISPNUM PROC
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10H
MOV CX, 4
DISPNUMLP1: XOR DX, DX
DIV BX
CMP DL, 10
JAE DISPNUMIF
ADD DL, 30H
JMP DISPNUMCO
DISPNUMIF: ADD DL, 37H
DISPNUMCO: PUSH DX
LOOP DISPNUMLP1
MOV CX, 4
DISPNUMLP2: POP DX
MOV AH, 2
INT 21H
LOOP DISPNUMLP2
POP DX
POP CX
POP BX
RET
DISPNUM ENDP
JIECHENG PROC
PUSH BP
MOV BP, SP
PUSH BX
PUSH CX
PUSH DX
MOV BX, [BP+4]
CMP BX, 1
JE JC1OUT
MOV CX, BX
DEC CX
PUSH CX
CALL JIECHENG
XOR DX, DX
MUL BX
JMP JCOUT
JC1OUT: MOV AX, 1
JCOUT:
POP DX
POP CX
POP BX
POP BP
RET 2
JIECHENG ENDP
NEWLINE MACRO
PUSH DX
PUSH AX
MOV DL, 0AH
MOV AH, 02H
INT 21H
POP AX
POP DX
ENDM
MAIN PROC FAR
MOV AX, STACK1
MOV SS, AX
MOV AX, STACK_BTM
MOV SP, AX
MOV AX, DATA1
MOV DS, AX
MOV ES, AX
GETNUM
NEWLINE
PUSH AX
CALL JIECHENG
CALL DISPNUM
EXIT: MOV AH, 4CH
INT 21H
MAIN ENDP
CODE1 ENDS
END MAIN
运行结果截图:
2、 乘/除,??转换综合,堆栈传参数,键盘控制循环
同上次
3、 串操作,要求同上
同上次
推荐阅读
-
x86汇编课程总结
-
alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)
-
32位汇编语言 在一段数组中找最大数 x86 汇编语言 asm文件 irvine32 intel 汇编语言
-
汇编语言||关于单片机数据的寻址方式总结
-
贺利坚老师汇编课程21笔记:用汇编语言写的源程序
-
汇编语言编程题总结(特别适用河北专接本)
-
Coursera课程 Programming Languages, Part C 总结
-
Coursera课程 Programming Languages, Part B 总结
-
php课程设计报告及源文件(大学生php实训报告总结)
-
C# 通过 inline-asm 解决嵌入x86汇编