回 帖 发 新 帖 刷新版面

主题:5555  学了几周汇编了  还是没有入门(已经解决)

汇编真的是很难入门啊  都开了几周课了 还是一点都不懂  希望大家帮我解释一些入门级别的问题

代码段是这样的 

DATA   SEGMENT
BUF    DB 'HOW ARE YOU!'
DATA   ENDS


其中数据段有个句子是这样

LEA DX,BUF

请大家解释一下 这两个句子  主要是代码段那个

回复列表 (共38个回复)

11 楼


这两个都是外部中断,是可以让我们掉 调用的程序
列如  对于中断  int21 的09H号功能  是用来在屏幕上显示 字符的
 对于 int 21H  AH=4C00H 其实是调用 第4C号功能 即中断完成,程序返回到刚开始调用此程序的程序
一般 有 内中断和外中断
内中断是cpu内部发生的中断(中断就是CPU放弃当前的运算,而去执行其他的命令,执行完后,又会自动返回以前的运算)
外中段(这样的中断可以在指令完成后,执行,也可以不执行)



12 楼

感谢a4099369大哥 给我的答复   原来我搞错了
MOV   AH,9
INT   21H

MOV   AH,4CH
INT   21H

这两个部分都是一起的   我还以为只有下面这两句是一起的 

上面那个部分的两句代码的作用是   用来在屏幕上显示 字符的

下面那个部分的两句代码的作用是   结束程序 返回DOS  

但a4099369大哥说的下面这句话 让我又有别的问题了 


“对于 int 21H  AH=4C00H 其实是调用 第4C号功能 即中断完成,程序返回到刚开始调用此程序的程序”
这大概就是说的
MOV   AH,4CH
INT   21H     这个代码吧    为什么是AH=4C00H呢   难道不是004CH?

13 楼

这是重复定义200个数据0   每个0占一个字节 ? 是这样吗?
这段代码有什么用    为什么这个地方是200?  
是这样的   用处就是 像你往一个地方存东西  先定义一个地方 方便查找
MOV   AH,9  这个有什么用呢? 它是中断 与  INT   21H  连用
后面的INT   21H  亦是中断

14 楼


各位 大哥  能再帮我解决一下问题吗 

STACK    SEGMENT STACK
DB       200 DUP(0)
STACK    ENDS
DATA     SEGMENT
BUF      DB 'HOW ARE YOU!'
DATA     ENDS
CODE     SEGMENT
         ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:   MOV   AX,DATA
         MOV   DS,AX
         LEA   DX,BUF
         MOV   AH,9
         INT   21H
         MOV   AH,4CH
         INT   21H
         CODE  ENDS
END BEGIN

经过这么多兄弟的解答   这个程序的每一个句子我基本上都能读懂了
但是只能每个部分的读懂   至于整个程序作为一个整体是如何联系的 我还是读不懂   有很多疑问   希望大家帮忙解释   谢谢

STACK    SEGMENT STACK
DB       200 DUP(0)
STACK    ENDS
上面这个堆栈段 我的理解是:重复定义200个数据0   每个0占一个字节 
但这段代码与下面的程序代码段 好象没什么联系啊   我不知道这段代码的作用是什么   希望大家给我解释下 


MOV   AX,DATA
MOV   DS,AX
上面这段代码是将代码段的段地址装入DS寄存器中   这句话与下面的  
LEA   DX,BUF  有什么联系我总是感觉很模糊 为什么一定要先将代码段的段地址存进DS寄存器中了    能给我解释下好吗

谢谢大家!

15 楼


DB       200 DUP(0)
这句话LZ没抄错吧。。。
正常的应该是
db 200 dup(?)
这是定义堆栈段长度。
正常程序默认的堆栈段是够用的,有时候程序比较大时,堆栈段可能不够用,所以进行长度定义,以满足程序的需求。
200只是看编程的人想给多少。你高兴改成500也行。。。

MOV   AX,DATA
MOV   DS,AX

这个是把数据段的地址送给DS吧   我在书上面看了 数据段和附加段需要这样

这是定义数据段基址。恭喜LZ答对了,加10分!

后面那个是DOS/BIOS功能调用。
INTn是指中断返回。
这涉及到操作系统的中断的相关问题,就不深入了。

16 楼

MM的帖果然回得人多啊....

17 楼


谢谢天空未蓝大哥给我的答复 我可以确定我没有抄错 的确得 DB  200DUP(0)但我不能保证书上面有没有打印错误    呵呵呵呵

  堆栈段长度可以自己定义  长度随便设置成多少  但总有给限度吧  堆栈段最长可以有多长呢?

18 楼


STACK    SEGMENT STACK
DB       200 DUP(0)
STACK    ENDS
DATA     SEGMENT
BUF      DB 'HOW ARE YOU!'
DATA     ENDS
CODE     SEGMENT
         ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:   MOV   AX,DATA     ;定义段基址
         MOV   DS,AX
         LEA   DX,BUF      ;将BUF的段地址送入DX中
         MOV   AH,9        ;使用09调用
         INT   21H           
         MOV   AH,4CH
         INT   21H
         CODE  ENDS
END BEGIN

MOV   AX,DATA
MOV   DS,AX
和LEA   DX,BUF的关系是必然的。

MOV   AX,DATA
MOV   DS,AX
是定义段基址的,如果没定义这个,那么该汇编程序无法执行。所以这句是程序执行的前提。
LEA DX,BUF是为了后面的09调用做准备的。
有空可以去查下这方面的内容。


19 楼

你学过C语言没有?这就像开辟一个数组,然后给它初值,你完全可以按自己的想法赋值,只要方便就行。至于200,你完全可以写成100或其他,只要这个空间够你用就行。

20 楼

晕....DB       200 DUP(0) 堆栈段定义200个字节用0填充...堆栈段用来存放临时变量.是不是200就不一定了.足够大就可以了.
move ah,9 
int 21h 
mov ah,4ch 
int 21h 
查看dos中断..就知道了.(dos经常用到..)

对了这
MOV   AX,DATA
MOV   DS,AX
为了让ds得到数据段......

还有这个程序最好加点

STACK    SEGMENT STACK
DB       200 DUP(0)
STACK    ENDS
DATA     SEGMENT
BUF      DB 'HOW ARE YOU!$'
DATA     ENDS
CODE     SEGMENT
         ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:   MOV   AX,DATA
         MOV   DS,AX
         LEA   DX,BUF
         MOV   AH,9
         INT   21H
         MOV   AH,4CH
         INT   21H
         CODE  ENDS
END BEGIN

我来回复

您尚未登录,请登录后再回复。点此登录或注册