- 环境配置
- xp环境配置
- 拷贝masm615到指定目录
- 将masm615目录添加进环境 变量
- 在cmd中输入ml,可识别即配置成功

win10使用dosbox示例:
找到dosbox的目录如下:将masm611拷贝进去

然后修改:DOSBox 0.74 Options.bat文件进行配置
将masm611的所在目录挂载到dosbox上
原来:
改动:
若有问题,可以尝试将路径用””包起来
例如:
- 编译命令
- ml/c asm文件.asm
- link asm文件.asm
- 编译+调试 脚本
- ml/c %1.asm
- link %1.obj
- debug %1.exe
- 示例:


示例代码:
assume cs:code,ds:data,ss:stackdata segmentg_sz db "hello word$" ;用$表示字符串的结束data endsstack segment stackdb 128 dup (0)stack endscode segmentstart:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axmov ah,9int 21hmov ax,4C00Hint 21Hcode endsend start


根据上面的编译+调试 脚本,我们新建一个build.txt(修改完改后缀名为.bat)
然后将其放到dosbox所挂c盘下
- 使用build(刚刚创建的.bat文件)
入口和段
- 入口
- 入口点指定使用关键字end,后面跟标号名
- 入口点可以写在任意段外面,但一般写在文件末尾

- 段
- 一个程序必须至少有一个段
- 一个程序中可以定义多个段
- 段不能嵌套
- 段可以重命名,重命名的段会被编译到同一块内存中

- 注释
- 汇编中使用分号(;)来标注行注释

- 常量
- 整数可以支持多个进制
- 数值必须以数字开头,如果非数字,前面必须加0
- 负数前面可以加减号(-)

- 字符
- 字符可以用单引号(‘)或双引号(“”)
- mov byte [bx],’$’
- mov byte [bx],”$”
- g_sz db “hello world$”;16位汇编中以美元符结尾
- 字符可以用单引号(‘)或双引号(“”)
- 变量
- 整数可以支持多个类型
- 整数可以有多个初值,未初始化的值用问好(?)表示
- 变量一般定义在一个单独的段中

assume cs:code,ds:data,ss:stackdata segment ;数据段g_db db 55hg_dw dw 6644hg_dd dd 77887788hg_dq dq 1122334455667788g_dt dt 11223344556677889900hg_dw0 dw ? ;是?的话,原来是什么数据就是什么,不初始化g_sz db "hello world$";16位汇编中以美元符结尾data endsstack segment stackdb 128 dup (0)stack endscode segmentval db 56hstart:mov ax,stackmov ss,axmov sp,128mov ax,4C00Hint 21Hcode endsend start
- 数组

data_seg1 segmentg_ary1 dw 5566h,7788h,9966hg_ary2 dw 10h dup(6666h)g_ary3 dw 9999,16 dup(7777h),4455h,16 dup(3322h)data_seg1 ends
- 属性
- masm提供了很多伪指令,可以获取变量的大小和地址,称之为变量的属性。

- ```matlab assume cs:code,ds:data,ss:stack
data segment ;数据段 g_db db 55h g_dw dw 6644h g_dd dd 77887788h g_dq dq 1122334455667788 g_dt dt 11223344556677889900h g_dw0 dw ? ;是?的话,原来是什么数据就是什么,不初始化 data ends
data_seg1 segment g_ary1 dw 5566h,7788h,9966h g_ary2 dw 10h dup(6666h) g_ary3 dw 9999h,16h dup(7777h),4455h,16 dup(3322h) data_seg1 ends
stack segment stack db 128 dup (0) stack ends
code segment
val db 56h
start:
mov ax,stack
mov ss,ax
mov sp,128
assume ds:data_seg1 ;要先用assume才能用mov指令访问对应段的标号mov ax,data_seg1 ;取段的地址mov ds,axmov ax,seg g_ary3 ;取g_ary3的段地址mov ax,offset g_ary3 ;取g_ary3的偏移地址lea ax,g_ary3mov ax,type g_ary2mov ax,length g_ary2mov ax,size g_ary2mov ax,4C00Hint 21H
code ends end start
<a name="WSGda"></a>## 堆栈- stack关键字让程序在被加载的时候指定ss、bp和sp。- 使用数组为栈设置大小- **调用dos功能号**- 功能号- dos系统提供的功能(API),通过21号中断来调用- 每个功能都有一个编号,通过AH指定功能号- 每个功能的参数查看手册- 例:显示字符```matlabassume cs:code,ds:data,ss:stackdata segment ;数据段g_sz db "hello word$" ;用$表示字符串的结束data endsstack segment stackdb 128 dup (0)stack endscode segmentval db 56hstart:mov ax,stackmov ss,axmov sp,128mov dl,"A"mov ah,2 ;int 21hmov ax,4C00H ;程序退出int 21Hcode endsend start

- 键盘输入示例
assume cs:code,ds:data,ss:stackdata segment ;数据段g_sz db "hello word$" ;用$表示字符串的结束g_buf db 255,255 dup(00)data endsstack segment stackdb 128 dup (0)stack endscode segmentval db 56hstart:mov ax,stackmov ss,axmov sp,128assume ds:datamov ax,datamov ds,axmov dx,offset g_bufmov ah,0ah ;0ah 输入到缓冲区 ds:dx=缓冲区首地址int 21hmov ah,1 ;键盘输入并回显int 21hmov ah,7 ;键盘输入无回显int 21hmov ah,8 ;键盘输入无回显 检测ctrl-breakint 21hmov dl,"A"mov ah,2int 21hmov ax,4C00H ;程序退出int 21Hcode endsend start
先演示输入字符串


assume cs:code,ds:data,ss:stackdata segment ;数据段g_sz db "hello word$" ;用$表示字符串的结束g_buf db 255,255 dup(00)data endsstack segment stackdb 128 dup (0)stack endscode segmentmov dx,offset g_szmov ah,9int 21hval db 56hstart:mov ax,stackmov ss,axmov sp,128assume ds:datamov ax,datamov ds,axmov dx,offset g_bufmov ah,0ahint 0mov ax,4C00H ;程序退出int 21Hcode endsend start
修图解析,e那里改变中断向量并表所记载的入口地址,改为code segment 的开始位置,有右边dosbox得知段地址为0785,偏移地址为0000
修改后查看一下
结果如下:
作业
4、 从键盘读入任意字符串(不超过255),并输出字符串长度和字符串内容
5、 从键盘读入任意字符串(不超过255),以第一个字母为文件名,将字符串存入文件。
6、 从键盘读入文件名,打开文件(不超过255),显示文件内容
8、 从键盘读入文件名,打开文件(不超过255),输出文件中字符的个数。
- 5 ```matlab data segment file db ‘?.txt’,0 buf db 100,?,100 dup(?) bufstr db 100,?,100 dup(‘$’) ;键盘输入会往后偏移两位 fh dw ?
error_msg db 0dh,0ah,’error!’,’$’ writer_msg db 0dh,0ah,’open file !input text:’,0ah,’$’ success_msg db 0dh,0ah,’done!’,’$’ data ends
stack segment stack dw 20h dup(?) top label word stack ends
code segment assume ds:data,cs:code,ss:stack p proc far
mov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top;输入字符串,取第一个字母为文件名lea dx,bufstrmov ah,0ah ;键盘输入字符串到缓冲区int 21hmov bl,[bufstr+2]mov [file],bl;lea dx,file ;文件名mov cx,0mov ah,3ch ;创建文件int 21hjc error
;================================================================= writer: mov fh,ax;save the code of file lea dx,writer_msg ;显示开始写字符 mov ah,09h int 21h
lea dx,bufmov ah,0ah ;键盘输入字符串到缓冲区int 21hlea si,buf ;inc sixor ch,chmov cl,[si];1inc simov dx,si;2mov bx,fh;3mov ah,40hint 21hjc error
;=================================================================
success:
lea dx,success_msg
mov ah,09h
int 21h
jmp exit
;=================================================================
error:
mov cx,16
mov bx,ax
l1: rol bx,1
mov dl,bl
and dl,1
add dl,30h
mov ah,02h
int 21h
loop l1
lea dx,errormov ah,09hint 21h
exit: mov ah,4ch int 21h
p endp
code ends end p
- 6```matlabdata segmentFileNameFuf db 100,?,100 dup(0)TheFile db 100 dup(0)file db 'test.txt',0buf db 100 dup(?)fh dw ?error_msg db 0dh,0ah,'error!','$'success_msg db 0dh,0ah,'done!','$'data endsstack segment stackdw 20h dup(?)top label wordstack endscode segmentassume ds:data,cs:code,ss:stackp proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top;输入文件名lea dx,FileNameFufmov ah,0ah ;键盘输入字符串到缓冲区int 21hxor cx,cxxor al,alcopy:lea bx,FileNameFufadd bx,2add bx,cxmov al,[bx]cmp al,0dhje endcopymov si,cxlea bx,TheFilemov ds:[bx+si],alcmp cx,100je endcopyinc cxjmp copyendcopy:;lea dx,file;open filelea dx,TheFilemov al,0mov ah,3dhint 21hjc errormov fh,ax;read filelea dx,bufmov cx,100mov bx,fhmov ah,3fhint 21hjc error; mov cx,ax; lea si,buf;l1: mov dl,[si]; inc si; mov ah,02h; int 21h; loop l1lea dx,buf ;显示开始写字符mov ah,09hint 21hjmp exiterror:lea dx,error_msgmov ah,09hint 21hexit:mov ah,4chint 21hp endpcode endsend p
