如何评价EOS M6 Mark2,有哪些不足跟
845 2023-08-01 05:21:28
运用int 10h中断……
比如要显示“一”,则先编码:
00000000 00
00000000 00
00000000 00
00000000 00
11111111 ff
00000000 00
00000000 00
00000000 00
然后再写:
one db 00h,00h,00h,00h,0ffh,00h,00h,00h
mov ax, ds
mov es, ax
mov ah, 10h ; 子功能号
mov al, 00h ; 加载自定义字符
mov bh, 08h ; 每个字符占字节数
mov bl, 00h ; 字符表
mov cx, 01h ; 自定义字符数量
mov dx, 41h ; 自定义字符ASCII开始值,这里是从’A’开始
lea bp, one ; 指针es:bp指向自定义字符表
int 10h ; 执行修改……
然后输出字符’A’就是自己定义的“一”字了,用同样的方法定义其他汉字……
一般汉字是一个ASCII占半个汉字,也就是先编码左半边,再编码右半边……
因为显示字符串子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用)。
DATASEGMENT ;定义数据段
MSG1DB’***WELCOME!***’,’$’;定义输出的第一个字符串信息,字符串必须用DB定义,$为结束标志
ERRMSG DB ’CHOOSE ERROR! -_-b’,’$’;定义输出的字符串信息:选择错误信息
DATA ENDS
;***************************************************************************************************
CODE SEGMENT ;定义代码段
main proc far
ASSUME CS:CODE ,DS:DATA
START:
PUSHDS
SUBAX,AX
PUSH AX
MOVAX,DATA
MOV DS,AX
CALL ENTER ;调用显示回车换行子程序
LEA DX,MSG1 ;输出第一个字符串的偏移地址
CALL DISPCHS ;调用显示字符串子程序
CALLENTER ;调用显示回车换行子程序
CALLENTER
LEADX,MSG2 ;输出第二个字符串的偏移地址
CALL DISPCHS ;调用显示字符串子程序
AGAIN:
CALL ENTER ;定义AGAIN标号.用于选择错误循环
LEA DX,MSG3 ;输出第三个字符串的偏移地址
CALL DISPCHS ;调用显示字符串子程序
MOV AH,01H ;调用1号功能:从键盘输入一个字符并回显;
INT 21H ;完成输入回显;
CMP AL,’1’ ;输入的字符和1相比较;
JE BASICP ;如果相等,转移到BASICP标号(JE=Jump if Equal)‘’
CMP AL,’2’ ;输入的字符和2相比较 ||
JE ADVANP ;如果相等,转移到ADVANP标号(JE=如果相等就转移)
JMP ERROR ;否则就无条件转移到ERROR标号
EXIT:
MOV AH,4CH ;4C号功能调用:终止当前程序并返回调用程序
INT21H ;返回DOS
BASICP:
CALL ENTER
LEA DX,MSG4 ;输出第三个字符串的偏移地址
CALLDISPCHS ;调用显示字符串子程序
CALL ENTER
JMP EXIT ;无条件转移到EXIT标号
ADVANP:
CALL ENTER
LEA DX,MSG5
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP EXIT ;无条件转移到EXIT标号
ERROR:
CALL ENTER
LEA DX,ERRMSG ;输出选择错误信息
CALL DISPCHS ;调用显示字符串子程序
MOV DL,07H ;输出ASCII码的报警(响铃)控制符BEL(07H)
CALL DISPCH ;调用显示单个字符子程序
CALL ENTER
JMP AGAIN
MAINENDP
MOV AH,02H ;2号功能调用:显示器输出字符
INT 21H ;完成输出显示
RET ;返回
DISPCH ENDP ;子程序结尾
ENTER PROC NEAR ;显示回车换行子程序
MOV DL,0DH ;输出ASCII码的回车控制符CR(0DH)
CALL DISPCH ;调用显示单个字符子程序
MOV DL,0AH ;输出ASCII码的换行控制符LF(0AH)
CALL DISPCH ;调用显示单个字符子程序
RET ;返回
ENTER ENDP ;子程序结尾
DISPCHS PROC NEAR;显示字符串子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用)
MOV AH,09H ;9号功能调用:显示字符串
INT 21H ;完成输出显示
RET
DISPCHS ENDP
CODE ENDS
运行DOSXBOX之後
Z:\ 》mount c c:\masm5 按下ENTER
键入
C:\ 按下ENTER(此时的DOSBOX中的C磁盘就是masm5的文件夹了)
win7可以运行masm5的,但是系统并不自带,所以楼主要去下载,然后解压到一个文件夹中,在cmd中进入所在目录,就可以运行masm5,并不像楼上所说的那样不能运行masm5,只是win7现在高级很多,所以的16位程序都无法全屏运行而已。。。。
方法一:可下载“GUI Turbo Assembler v3.0.1”软件安装即可,它支持tasm4.0。
方法二:安装“dosbox0.74”软件,在该软件虚拟的16位dos环境中可运行masm5。
用这个东西编译时,要把源文件保存为.asm后缀。
然后在盘符输入masm5的所在路径,
如在D盘下
d:\mams5》
编译时就
d:\mams5》masm 你的ASM文件名;
只要名,不需要打后缀
就可以生成OBJ文件了。
SHR AL,4 移位指令中的移位次数要用CL,不能是立即数
MOV CL,4
SHR AL,CL
另外:
JB C2
ADD AL,07H 这里应该是ADD AL,37H 吧
C2:
ADD AL,30H
masm,就是汇编编译器啦!不过也有点过时了,因为毕竟是命令行式的,不过我用的是。。。
用法如下:
Masm5的话,在masm5目录下键入masm 文件名 回车,然后连续回车三次。
然后在键入link 文件名,再连续回车。。。然后生成exe文件(前提是你写的是对的)
Masm6简单些,在masm6目录下键入masm 文件名 回车,然后连续回车三次。就自动连接生成exe了。
下面是多个段的框架。data segment
s:
data ends
code segment assume cs:code,ds:data
start: mov ax,code mov cs,ax mov ax,data mov ds,ax另外,VC中*(int *)0xb8001=5;是向内存中写入4个字节,其内容为5。但是0xb8001的内存地址未必有效。
code ends
end start