汇编语言学习4-5

echoker 2024-12-01 18:33:15
Categories: Tags:

第一个程序

源程序与编译连接

在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

image-20241201131018725

[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指向程序第一条指令

image-20241201132359033

使用g 偏移地址直接一次性执行到循环段,不必按多次t。在源程序中loop后面跟着标号,此处就是偏移地址了

image-20241201133122569

按t执行,可以看到loop命令就是将IP不断重新指向原来的偏移地址,实现循环,CX也随着循环的执行,不断变小(CX=CX-1),直到CX=0时,跳出循环

image-20241201183132745