16位汇编 05

>> 环境配置

 

** xp环境配置

1:拷贝masm615到指定目录

2:将masm615目录添加到环境变量

3:在cmd中输入ml, 可以识别即配置成功

 

** dosbox环境配置

1:拷贝msam611到指定目录

2:将msam611所在目录添加进dosbox

3: 将msam611目录在dosbox中添加进环境变量

4:在cmd中输入ml, 可以识别即配置成功

 

** 编译命令

ml /c asm文件.asm

link asm文件.obj

 

** 编译+调试 脚本

ml /c %1.acm

link %1.obj

debug %1.exe

 

>> 入口和段

 

 

>> 入口:

1:入口点指定使用关键字end, 后面跟标号名

2:入口点可以写在任意的段外面, 但一般写在文件末尾

 

例如: 下面start (标号)就是一个入口点

 

 

其中end start 可以放在最下面, 也可以放在最上面,或者中间, 就是不能放在

XXX_seg segment 和 XXX_seg ends中间

 

 

 

 

>>

 

1:一个程序必须至少有一个段

2: 一个程序中可以定义多个段

3:段不能嵌套

4:段可以重名, 重名的段会被编译到同一块内存中

>> 注释

 

1: 汇编中使用分号“;” 来标注行注释

 

;这里是注释

 

mov ax, bx; 这里是注释

 

只有行注释,没有块注释

 

>> 常量

 

>> 整数

1:数值可以支持多个进制

2:数值必须以数字开头, 如果非数字, 前面必须加0

3:负数前面可以加减号(-)

示例:

 

 

>> 字符常量

1:字符可以用单引号(' ')或者双引号(" ")

例如:mov byte ptr [bx], '$'

 

没有字符串常量

 

>> 变量

>> 整数

1:整数可以支持多个类型 - 类型指的是数据的宽度(byte, word, dword, qword)

2:整数可以有多个初值, 未初始化的值用问号(?)表示

3:变量一般定义在一个单独的段中

 

示例:

 

 

>> 字符串

1:字符串都可以用单引号或者双引号

2:字符串一般以美元符号($)结尾

 

 

>> 数组

 

 

>> 堆栈段赋值

第一种方式:

 

第二种方式

在定义堆栈段开始的而地方, 后面加上 stack

 

 

 

>> 属性

 

示例:

movaxmovaxmovaxleaaxmovaxmovaxmovax

 

>> 访问结构体

 

assume ds:data_seg

上面一行代码是访问结构体需要用到的

 assume ds:data_seg
 mov ax, data_seg
 mov bx, g_dw
 mov bx, offset g_dw

上面 mov bx, g_dw计算data_seg数据段中g_dw变量的段内偏移

 

上面数据类型db, dw,dd, dq, assume

等等称为伪指令

 

 

要想访问数据段里面的变量,要在前面声明具体的数据段,

示例:

assumedsmovax

上面的一行代码相当于命名空间的问题

 

>> 数据段寄存器赋值

 

程序执行后, 段寄存器里面的初始值除了CS代码段的值的可靠的, 其他几个段寄存器的初始值不可靠。

 

所以代码段里要给数据段寄存器赋值

 

 

 

 

示例代码:

stack_seg segment  stack
     db 256 dup(0cch)


stack_seg ends




data_seg segment
  
   g_db db 56h
   g_dw dw 6666h
   g_dd dd 777777h
   g_dq dq 888888888h
   g_dt dd 999999h

   d_db db "hello world$"

data_seg ends



data_seg1 segment
  
   g_ary1 dw 5566h, 7788h, 9966h
   g_ary2 dw 10h dup(6666h)
   g_ary3 dw 9999h, 16 dup(7777h), 4455h, 16 dup(3322h)

data_seg1 ends



code_seg segment
start:
   
  ;给数据段赋值
  mov ax, data_seg
  mov ds, ax
 
  assume ds:data_seg
  mov ax, g_dw

   ;给堆栈段赋值
   assume ds:stack_seg
   mov ax, stack_seg
   mov ss, ax  ;堆栈段寄存器,保存堆栈段段基址
   mov sp, 255 ;堆栈指针寄存器, 指向栈底


   mov ah, 4ch
   mov al, 0
   int 21h
   
code_seg ends

end start
    

 

 


 

>> 调用dos功能号

 

这些功能函数都是0x21中断号里面的

 

 

AH寄存器里面存放功能号,其他寄存器里面存放参数

 

 

程序正常退出, 并且带退出码

 

0x4c功能号为,退出程序功能号

 

 

输出字符

功能号:2

 

输出字符串:

功能号:9

 

 

从键盘输入字符, 回显

功能号: 1

 

 

 

从键盘输入字符, 无回显

功能号: 7

 

 

输入字符串:

功能号:a

 

posted @ 2022-03-03 20:50  冷酷的国度  阅读(145)  评论(0)    收藏  举报