主题:5555 学了几周汇编了 还是没有入门(已经解决)
风一般的女孩
[专家分:50] 发布于 2006-12-15 12:00:00
汇编真的是很难入门啊 都开了几周课了 还是一点都不懂 希望大家帮我解释一些入门级别的问题
代码段是这样的
DATA SEGMENT
BUF DB 'HOW ARE YOU!'
DATA ENDS
其中数据段有个句子是这样
LEA DX,BUF
请大家解释一下 这两个句子 主要是代码段那个
回复列表 (共38个回复)
11 楼
a4099369 [专家分:140] 发布于 2006-11-18 21:07:00
这两个都是外部中断,是可以让我们掉 调用的程序
列如 对于中断 int21 的09H号功能 是用来在屏幕上显示 字符的
对于 int 21H AH=4C00H 其实是调用 第4C号功能 即中断完成,程序返回到刚开始调用此程序的程序
一般 有 内中断和外中断
内中断是cpu内部发生的中断(中断就是CPU放弃当前的运算,而去执行其他的命令,执行完后,又会自动返回以前的运算)
外中段(这样的中断可以在指令完成后,执行,也可以不执行)
12 楼
风一般的女孩 [专家分:50] 发布于 2006-11-18 21:42:00
感谢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 楼
330317 [专家分:30] 发布于 2006-11-19 13:25:00
这是重复定义200个数据0 每个0占一个字节 ? 是这样吗?
这段代码有什么用 为什么这个地方是200?
是这样的 用处就是 像你往一个地方存东西 先定义一个地方 方便查找
MOV AH,9 这个有什么用呢? 它是中断 与 INT 21H 连用
后面的INT 21H 亦是中断
14 楼
风一般的女孩 [专家分:50] 发布于 2006-11-19 14:52:00
各位 大哥 能再帮我解决一下问题吗
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 楼
天空未蓝 [专家分:360] 发布于 2006-11-20 08:00:00
DB 200 DUP(0)
这句话LZ没抄错吧。。。
正常的应该是
db 200 dup(?)
这是定义堆栈段长度。
正常程序默认的堆栈段是够用的,有时候程序比较大时,堆栈段可能不够用,所以进行长度定义,以满足程序的需求。
200只是看编程的人想给多少。你高兴改成500也行。。。
MOV AX,DATA
MOV DS,AX
这个是把数据段的地址送给DS吧 我在书上面看了 数据段和附加段需要这样
这是定义数据段基址。恭喜LZ答对了,加10分!
后面那个是DOS/BIOS功能调用。
INTn是指中断返回。
这涉及到操作系统的中断的相关问题,就不深入了。
16 楼
berger [专家分:0] 发布于 2006-11-20 10:32:00
MM的帖果然回得人多啊....
17 楼
风一般的女孩 [专家分:50] 发布于 2006-11-20 18:05:00
谢谢天空未蓝大哥给我的答复 我可以确定我没有抄错 的确得 DB 200DUP(0)但我不能保证书上面有没有打印错误 呵呵呵呵
堆栈段长度可以自己定义 长度随便设置成多少 但总有给限度吧 堆栈段最长可以有多长呢?
18 楼
天空未蓝 [专家分:360] 发布于 2006-11-20 21:55:00
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 楼
wp2011 [专家分:130] 发布于 2006-12-02 22:48:00
你学过C语言没有?这就像开辟一个数组,然后给它初值,你完全可以按自己的想法赋值,只要方便就行。至于200,你完全可以写成100或其他,只要这个空间够你用就行。
20 楼
undeadbird [专家分:2570] 发布于 2006-12-03 09:54:00
晕....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
我来回复