--------------------------------------------------------------
最近在学习汇编语言,也做了两个实验,以此记录一下。
这里有很多汇编的学习资料--各种课件,实验,配置环境(↓),书籍等等(密码wxbl)
【环境配置】
先简单在64/32位机上配置汇编运行环境
1.下载Dosbox并安装
2.下载masm工具并解压到E盘(或其他盘)的DOS文件夹下
3.运行Dosbox,输入如下便可进入汇编环境(图中为把盘符c进行挂载到e目录下)
【顺序程序设计过程】
在E:\DOS文件夹下创建test1.txt,输入以下代码后保存更名位test1.asm(在20个学生中查询8号学生的成绩)
DATA SEGMENT
TABLE1 DB 81,78,90,64,85,76,93,82,57,80
DB 73,62,87,77,74,86,95,91,82,71
NUM DB 8
MATH DB ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0) //此处暂时无实际意义,以后要用到堆栈时才具体定义;还可以用于表示重复次数,DUP(?)表示duplicate(重复)?内容
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1 //用ASSUME伪指令指示段与段寄存器的对应关系
BEGIN: MOV AX,DATA //以下两行为将DATA中的段基值通过AX送到DS
MOV DS,AX
MOV BX,OFFSET TABLE1 //OFFSET为取TABLE1的偏移地址,与指令LEA BX,TABLE1等价
XOR AH,AH
MOV AL,NUM
DEC AL
ADD BX,AX
MOV AL,[BX]
MOV MATH,AL
MOV AH,4CH //以下两行为停机指令
INT 21H
CODE ENDS
END BEGIN //汇编对代码的大小写是不敏感的
由上面代码可见,汇编程序由四个段组成:数据段,附加段,堆栈段,代码段
附加段:附加数据段,对应的是ES寄存器,用来访存串指令的目的串,一般情况下附加段省略;
若有两个数据段,这ES指向该数据段(例如:DATA2)
然后:在Dosbox中,执行以下指令:tasm test1.asm——link test1.obj——debug test1.exe(进//入调试)
-U://反汇编命令,可以看到源代码,内存偏移地址或段基值等等
示例:0770:0000 B86A07 MOV AX,076A (此处的076A为DATA数据段的段基值)
分别为 段基址:偏移地址 机器代码 指令代码
(注:由于内存的分段管理,“段基址:偏移地址”为逻辑地址,指向物理地址)
-R://查看各寄存器的内容
!!其中DS中显示的并不是数据段的段基值,而是存放数据的地方,而数据段的段基值必须是076A
-D://给出DATA段在内存的起始地址
以下为错误操作:应该给出起始地址和终止地址(实为给出DATA的逻辑初始地址)
正确操作如下:076A为DATA的段基值
此时显示的正是20个学生的成绩(16进制),第21个为要查询的学生的号码
-G://执行汇编程序
此时再执行-D命令,可见要查询的学生的成绩已经放在第22位(偏移地址为21)
…………
分支程序设计与前面过程相似,下面只给出源代码
TEST.ASM //把buffer中87,234,123三个数按大到小重新排列存回缓冲区
DATA SEGMENT
BUFFER DB 87,234,123
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
START:MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BUFFER
MOV AL,[SI]
MOV BL,[SI+1]
MOV CL,[SI+2]
CMP AL,BL
JNB NEXT1
XCHG AL,BL
NEXT1:CMP AL,CL
JNB NEXT2
XCHG AL,CL
NEXT2:CMP BL,CL
JNB NEXT3
XCHG BL,CL
NEXT3: MOV [SI],AL
MOV [SI+1],BL
MOV [SI+2],CL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
-----------------------------------------------------------------------------------------END--------------------------------------------------------------------------------------------------
未完待续,望路过大神不吝指点。
A slower never walks backwards.
----A_slower