汇编——Masm使用及程序结构

Masm使用及程序结构

1、使用编辑器建立源程序文件test1.asm:
edit test1.asm

内容如下:

Data segment
	X1 db 1ah
	Y1 db 2bh
	X2 dw 1234h
	Y2 dw 0abcdh
Data ends
Stack segment para stack
	Db 10 dup(0)
Stack ends
Code segment
	Assume cs:code,ds:data,ss:stack
Start: 	mov ax,data
 		Mov ds,ax
		Mov ax,x2
		Mov bx,y2
		Push ax            将ax压入堆栈,栈顶指针SP自动减2
		Mov dh,y1
        Mov ah,4ch
        Int  21h
Code ends
End start

编译这个源程序文件:masm test1.asm

有错则返回编辑修改,编译通过后连接:Link test1.obj

成功后用debug调入内存:debug test1.exe

画出内存中这3个段,标出段起始地址及段内存储的内容;
标出几个变量对应的偏移量(IP为指令指针寄存器,用来存放代码段中的偏移地址。在程序运行过程中,它始终指向下一条指令的首地址.)
标出栈底的位置
单步运行程序,观察ds的变化;观察相关寄存器;观察SP

Push ax 将ax压入堆栈,栈顶指针SP自动减2

结果可由图示:
在这里插入图片描述

数据区可由图示:
在这里插入图片描述

此例中,若有如下操作:

mov ax,x1
mov bl,x2    将会怎样?说明什么?

只有AX和BX寄存器里的内容发生变化,其他各寄存器不变。说明该操作只对数据段产生影响,不影响代码段和堆栈段。

在这里插入图片描述

2、编程完成字运算:W=X+Y-Z

源程序:

Data segment
    X  dw  2
    Y  dw  3
    Z  dw  1
    W  dw  ?
Data ends
Stack segment  para stack
    Dw 10 dup(0)
Stack ends
Code  segment
Assume cs:code,ds:data,ss:stack
Start:  mov ax,data
        mov ds,ax
        mov ax,x
        add ax,y
        sub ax,z
        mov w,ax
        mov ah,4ch
        int  21h
Code  ends
End  start

程序编译通过。

可从数据段的起始地址d076A:0000查看内存,图示结果可见正确。
在这里插入图片描述

3、建立源程序test2.asm

Data segment
	X1 db 1
	X2 db 2
	X3 db 3,4,5,6
	X4 dw 0ah
	X5 dw 0bh,0ch,12abh
Data ends
Stack segment para stack
	Db 10 dup(0)
Stack ends
Code segment
	Assume cs:code,ds:data,ss:stack
Start: 	mov ax,data
 		Mov ds,ax
		Mov al,x3
		Mov bx,x5
Code ends
End start

编译连接后用debug调入内存
在这里插入图片描述

画出数据段在内存中的存放情况,各个变量的位置(偏移量)
在这里插入图片描述

数据段段基址为076a
在这里插入图片描述

4、建立test3.asm

Data segment
	X1 db ‘ABCDE’
	X2 db 41h,42h,43h,44h,45h
Data ends
Stack segment para stack
	Db 10 dup(0)
Stack ends
Code segment
	Assume cs:code,ds:data,ss:stack
Start: 	mov ax,data
 		Mov ds,ax
		Mov al,x1
		Mov bl,x2
Code ends
End start

编译连接后用debug调入内存

画出数据段在内存中的存放情况,各个变量的位置(偏移量)

在这里插入图片描述

数据段段基址为076a

在这里插入图片描述

所以A,B,C,D,E对应的ASCII码分别是41,42,43,44,45
在这里插入图片描述

5、建立test4.asm

Data segment
	X1 db   6  dup(2)
	X2 dw   4  dup(1)
Data ends
Stack segment para stack
	Db 10 dup(0)
Stack ends
Code segment
	Assume cs:code,ds:data,ss:stack
Start: 	mov ax,data
 		Mov ds,ax
		Mov al,x1
		Mov bl,x2
Code ends
End start

编译连接后用debug调入内存

运行的截图我就不放了…

画出数据段在内存中的存放情况,各个变量的位置(偏移量)

在这里插入图片描述

数据段段基址为076a

在这里插入图片描述
6、建立test5.asm

Data segment
	Org 0004h
NUM  DB  75H
	ARRAY  DW  20H  DUP(0)
	ADR1  DW  NUM
	ADR2  DD  NUM
	ADR3  DW  ARRAY[2]
Data ends
Stack segment para stack
	Db 10 dup(0)
Stack ends
Code segment
	Assume cs:code,ds:data,ss:stack
Start: 	mov ax,data
 		Mov ds,ax
		Mov ax,adr1
		Mov bx,adr3
Code ends
End start

编译连接后用debug调入内存

画出数据段在内存中的存放情况,各个变量的位置(偏移量)、内容

在这里插入图片描述

数据段段基址为076a,Org 0004h表示NUM的偏移量为0004h
在这里插入图片描述

NUM的偏移量为0004,内容为75H;
ARRAY偏移量为0005,内容为20H个字,占64个字节;
ADR1(字)的内容为NUM的偏移量,为0004;
ADR2(双字)的内容为NUM的偏移量,为076A0004;
ADR3(字)的内容为ARRAY的偏移量加2,为0007。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值