笔者是初学者,对汇编语言掌握不是很深,代码写的不够好,希望读者多多体谅,有哪里是错误的或是可以改进的地方,欢迎大家在评论区评论!
64位系统的电脑需要用到dosbox模拟器进行16位操作,以下代码均在DOSbox0.74上运行
DOXbox0.74基本操作:
- 1.打开dosbox或者打开dos命令行
- 2.挂载电脑硬盘到dosbox 挂载命令 mount d d:\XXXX(在电脑的D盘建立文件夹)
- 3.基本dos命令:在D盘根目录下建立自己的工作文件夹(与上一个步骤的文件夹名字相同),并把masn.exe link.exe 和Debug.exe放到自己的文件夹。
- 在记事本上写最初的汇编程序,并另存为格式:所有文档的ASM文件,存在上面的文件夹里
- 打开DOSbox把编写的汇编程序用masm进行编译生成obj目标文件
- 把目标文件用link进行链接生成Exe可执行文件
- 调试文件: debug +文件名.exe
- (删除文件del 文件名.文件格式)
4.常见的调试命令
- -A 汇编
- -G 连续运行
- -T 单步运行
- -C 比较命令
- -D 查询
- -E 写入
- -F 写入字符串
- -q 跳出当前调试
- 01 一个字符段的搬运程序:要求把原地址3000段开始后的8个数据移动到4000段开始的地址保存。
- 调试步骤1.查询3000H开始的8个数值 (-d)
- 2.更改数据 把数据改为00 01 02 03 04 05 06 07(-e)
- 3.运行程序进行搬运(-g)
- 4.查询4000H段内的数据(-d)
- 代码如下:
-
CODE SEGMENT ASSUME CS:CODE START:MOV SI,4000H MOV AX,[SI] MOV BX,[SI+1] MOV CX,[SI+2] ADD BX,AX ADD CX,BX MOV [SI+3],CX INT 03H CODE ENDS END START
-
总结:在做的时候发现在DOXbox上无法使用存储器直接寻址(一直无法运行出正确的结果),所以后面都用寄存器间接寻址代替。
-
02 分别在内存地址4000H、4001H、4002H输入三个个位数,把这三个数相加后的结果写入4003H地址内
-
CODE SEGMENT ASSUME CS:CODE START:MOV SI,4000H MOV AX,[SI] MOV BX,[SI+1] MOV CX,[SI+2] ADD BX,AX ADD CX,BX MOV [SI+3],CX INT 03H CODE ENDS END START
03 把4000H、4001H的低位分别送入4002H高低四位(一般本程序用于把显示缓冲区的数据取出拼装成一个字节)
-
CODE SEGMENT ASSUME CS:CODE START:MOV SI,3000H MOV DI,3004H MOV CX,000AH A:MOV AX,[SI+9] MOV [DI+9],AX DEC SI DEC DI DEC CX JNZ A B:INT 03H CODE ENDS END START
-
04 分别在内存地址 3000H 后输入 10 个数据,把这10个数移动到 3004H后的 10 个地址内。(当原地址段和目标地址如果出现重复的时候,数据的该如何移动)——倒着存数据
-
CODE SEGMENT ASSUME CS:CODE START:MOV SI,3000H MOV DI,3004H MOV CX,000AH A:MOV AX,[SI+9] MOV [DI+9],AX DEC SI DEC DI DEC CX JNZ A B:INT 03H CODE ENDS END START
- 05 从键盘输入一位数字,判断其奇偶性,若为奇数,在屏幕上输出字符串“It is odd!”
否则输出“It is even!”
DATA SEGMENT
STRING1 DB 'IT IS ODD!$'
STRING2 DB 'IT IS EVEN!$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;01 用div做商后判断余数来区别奇偶
START:
MOV AX,DATA
MOV DS,AX
MOV AH,01H
INT 21H
MOV BL,2
DIV BL
CMP AH,0
JE EVN
JNE ODD
ODD:MOV DX,OFFSET STRING1
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
EVN: MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
;02 用RCR右循环判断是否进位判断奇偶性
START:
MOV AX,DATA
MOV DS,AX
MOV AH,01H
INT 21H
CLC
RCR AL,1
JNC EVN
MOV DX,OFFSET STRING1
CALL DISPMESS
EVN: MOV DX,OFFSET STRING2
CALL DISPMESS
DISPMESS PROC
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
DISPMESS ENDP
总结:在调试程序时要先连续执行后,再输入一个奇数/偶数,否则会一直无法正常运行
06 有三个单字节无符号数存放在BUFFER开始的缓冲区中,将这三个数按从大到小排序。
DATA SEGMENT
MSG1 DB 'Enter the first value(0-9):$'
MSG2 DB 0DH,0AH,'Enter the second value(0-9):$'
MSG3 DB 0DH,0AH,'Enter the third value(0-9):$'
MSG4 DB 0DH,0AH,'After sorting...$'
NUM1 DB 0DH,0AH,'Num1=$'
NUM2 DB 0DH,0AH,'Num1=$'
NUM3 DB 0DH,0AH,'Num1=$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV BL,AL
MOV DX,OFFSET MSG2
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV CL,AL
MOV DX,OFFSET MSG3
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV BH,AL
CMP BL,CL
JAE NEXT1
XCHG BL,CL
NEXT1: CMP BL,BH
JAE NEXT2
XCHG BL,BH
NEXT2: CMP CL,BH
JAE DISPLAY
XCHG CL,BH
DISPLAY:MOV DX,OFFSET MSG4
MOV AH,09H
INT 21H
MOV DX,OFFSET NUM1
MOV AH,09H
INT 21H
MOV DL,BL
MOV AH,02H
INT 21H
MOV DX,OFFSET NUM2
MOV AH,09H
INT 21H
MOV DL,CL
MOV AH,02H
INT 21H
MOV DX,OFFSET NUM3
MOV AH,09H
INT 21H
MOV DL,BH
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
先写到这,谢谢观看!欢迎大家指正!