第一个程序
源程序与编译连接
在DOS中可以通过edit编辑文本文件
汇编语言包含汇编指令和伪指令,CPU只执行由汇编指令编译成的机器指令,编译器根据伪指令进行编译相关的工作。
assume cs:codesg ;将有特定用途的段和相关的段寄存器关联
codesg segment ; 程序由多个段组成。XXX为段名称(标号),XXX segment,与底部的 XXX ends成对出现
mov ax,0123h ;数值末尾带着h,代表十六进制,也可以不带,就是十进制
mov bx,0ffffh ;数值必须以数字开头,字母前需要加个0
add ax,[bx] ;源程序和debug不同,[]内不能直接用数值常量代表偏移地址
add ax,ds:[0ffffh] ;如果需要用常量,需要先指定段寄存器。如果按debug那样写(ax,[ffff])会编译器被识别为ax,ffffh
add dx,es:[0ffffh] ;可以用除DS外的段寄存器存放段地址,避免在需要使用多个段地址的情况下,不断重复设置DS
mov ax,4c00h
int 21h ;程序末尾使用这两条指令实现程序返回
codesg ends
end
使用masm xxx.asm;
和link xxx.obj;
,(结尾加分号)简化编译和连接
程序执行过程
DOS的command将程序加载进内存,并将CPU的CS:IP指向程序的第一条指令,也就将CPU的控制权交给了程序,程序返回后,又将CPU控制权还给command
[BX]和loop
bx存放一个偏移地址,就可以使用[bx],效果等同于debug中的[偏移地址],在上文源程序中已经展示过了。
inc指令:inc bx,bx加一,类似于C语言的自增i++
Debug中跟踪loop指令
assume cs:code
code segment
mov ax,20h
mov ds,ax
mov cx,3fh ;cx存放循环次数
mov bx,0
s:mov [bx],bx
add bx,1
loop s
mov ax,4c00h
int 21h
code ends
end
debug xxx.exe
跟踪程序
进入可以看到CS:IP指向程序第一条指令
使用g 偏移地址
直接一次性执行到循环段,不必按多次t。在源程序中loop后面跟着标号,此处就是偏移地址了
按t执行,可以看到loop命令就是将IP不断重新指向原来的偏移地址,实现循环,CX也随着循环的执行,不断变小(CX=CX-1),直到CX=0时,跳出循环