汇编语言 第一个程序

汇编语言程序的上机过程及调试(汇编语言源程序编写和堆栈平衡)(1)

源程序从写出到执行的过程伪指令程序返回编译和链接

汇编语言程序的上机过程及调试(汇编语言源程序编写和堆栈平衡)(2)

段前缀PSP

汇编语言程序的上机过程及调试(汇编语言源程序编写和堆栈平衡)(3)

PSP:DOS要利用PSP段前缀和被加载的程序进行通信。

bx偏移地址loop循环指令段前缀

用于显式的指明内存单元的段地址。

  • mov ax,ds:[bx]
  • mov ax,cs:[bx]
  • mov ax,ss:[bx]
  • mov ax,es:[bx]
debug和masm对指令的不同处理
  • debug将 mov ax,[0] 中的 [0] 解释成内存单元,而masm汇编源程序将其解释成 0
  • 解决方案:使用bx或者显示给出段寄存器
一段安全的空间

在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间可能存放着重要的系统数据或代码。

assume cs:code code segment start:mov ax,0 mov ds,ax mov ds:[26h],ax mov ax,4c00h int 21h code ends end start

汇编语言程序的上机过程及调试(汇编语言源程序编写和堆栈平衡)(4)

练习

计算 ffff:0006 单元中的数乘以123,结果存储在dx中。

  • 汇编源程序中,数字不能以字母开头
  • 跳出循环g IP

assume cs:code code segment mov ax,0ffffH mov ds,ax mov bx,6 mov al,[bx] mov ah,0 mov dx,0 mov cx,123 s:add dx,ax loop s mov ax,4c00H int 21H code ends end

数据放在什么位置?
  • 之前的程序中只有一个代码段,那么数据应该存放在什么位置?
  • 为了保证数据安全,0:200 ~ 0:2FF是相对安全的,但是这段空间容量只有256个字节,如果超出这个限制,数据应当如何存放?
数据段

汇编语言程序的上机过程及调试(汇编语言源程序编写和堆栈平衡)(5)

assume cs:code code segment ; define word dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H start:mov bx,0 mov ax,0 mov cx,8 s:add ax,cs:[bx] add bx,2 loop s mov ax,4c00H int 21H code ends end start

call指令

当CPU执行 call 标号时,相当于进行:

  • push IP
  • jmp near ptr 标号

当CPU执行 call far ptr 标号时,相当于进行:

  • push CS
  • push IP
  • jmp far ptr 标号
ret和retf指令
  • ret:pop IP
  • retf: pop IP pop CS
堆栈平衡
  • EBP栈底指针
  • ESP栈顶指针
  • 进入call前与执行call后EBP和ESP的值不变
  • push ebp:相当于 sub,esp,4 和 mov [esp],ebp
  • pop ebp:相当于 mov ebp,[esp] 和 add esp, 4
补充指令

XCHG

  • 交换指令只可以在寄存器之间、寄存器与存储器之间进行
  • 两个操作数长度必须相等
  • 例如:XCHG AX,BX

NOT

  • 取反指令
,