首页
社区
课程
招聘
[求助]一个简单的汇编问题。
发表于: 2006-3-19 21:46 8347

[求助]一个简单的汇编问题。

2006-3-19 21:46
8347

下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。
assume cs:code
code segment

mov ax,________
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,_____________
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end
提示:(1)复制的是什么?从哪里到哪里?(2)复制的是什么?有多少个字节?读者如何知道要复制的字节的数量?
这是《汇编语言》里的,问一下应该复制多少字节?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
code segment
          assume cs:code
start:
      mov ax,cs
      mov ds,ax
      mov ax,0020h
      mov es,ax
      mov bx,0
      mov cx,LENGTH1
s:    mov al,[bx]
      mov es:[bx],al
      inc bx
      loop s
LENGTH1 equ $-start
      mov ax,4c00h
      int 21h
code ends
      end start
2006-3-20 00:49
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
LENGTH是MASM的保留字, 换个名吧
2006-3-20 12:14
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢了,可这个指令还没讲到呢。
2006-3-20 12:17
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
LENGTH不是指令, 只是一个伪指令
2006-3-20 13:02
0
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6

长时间不用汇编写东西,大意
2006-3-20 14:00
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这是王爽编写的那本汇编教程的试验4的第三题吧。
我也不会做。
LENGTH在前五章中还没讲呢。
根据前两题的问题,应该是:
mov ax,0

mov cx,64

就是不明白这几个问题:(1)复制的是什么?从哪里到哪里?(2)复制的是什么?有多少个字节?读者如何知道要复制的字节的数量?
2006-3-20 15:41
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是的,就是那本书,第一个应该是cs,可是第二个在没有学伪指令之前,应该怎么做还是不知道。
2006-3-20 18:44
0
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
可以把  LENGTH1 equ $-start  换成一个标号

长度是两个标号的差
2006-3-20 18:51
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你好好看看书上的5.2节。
就明白CX中应该存放什么了。
2006-3-21 09:22
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
11
这种书不要再读了,误人子弟,尽出一些完全没有任何用处的题目,设置si, di, 到源和目标地址, 按 9 楼的方法或 2 楼的方法得到需要移动的长度, cld 确定移动的方向, repmovsb就结束。
前不久也在这里看到一个这个“爽”出的自杀题目,觉得这个人尽从理论来考虑问题,不从实战出发,这样一本书学精了,到实际运用时,还是"拔剑四顾心茫然",而且现在的win32系统采用 flat 模式,段寄存器已经被遗忘了。
2006-3-21 15:26
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢楼上的。
前几天那个问题应该就是我问的。
可是对于没有任何编程基础人来说,想学习汇编,只能找最简单的书入门。
到现在为止,我还没有找到一本入门的书籍。

学汇编都半年多了,可到现在还是很茫然,不知道自己究竟该去做什么,拿汇编干什么。
昨天终于把书翻到了第14章,同时也买了一本汇编语言案例在琢磨,仍然读不懂很多代码。
我学习汇编,只是想沿着众位大哥们的脚步,去学习软件调试和破解,甚至有过想研究病毒的冲动,可是到现在,连对数据计算的程序都写不好,谈何去编写文件程序、数据通讯程序呢?

自学汇编,真的很难。
茫然。
2006-3-21 17:23
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
恢复楼主,这一题的答案应该是:

assume cs:code
code segment

mov ax,________0    初始化ax
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,_____________64   设置循环次数
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end
2006-3-21 17:28
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
Kven,你的0和64是怎么出来的?第一个应该是cs才是指向指令的段地址,第二个是怎么推出来的(在没学后来的内容的情况下)?
我的QQ:369226886,希望能一起学习交流。我学汇编的目的就是想破解,要是用它编软件太痛苦了。
2006-3-21 18:23
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
kven,我看了你的2月份的问题(0-63),不需要[bx+],我的是:
assume cs:code
code segment
mov bx,0
mov cx,64
mov ax,0020h
mov ds,ax
s:mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
2006-3-21 19:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 gzgzlxg 发布
这种书不要再读了,误人子弟,尽出一些完全没有任何用处的题目,设置si, di, 到源和目标地址, 按 9 楼的方法或 2 楼的方法得到需要移动的长度, cld 确定移动的方向, repmovsb就结束。
前不久也在这里看到一个这个“爽”出的自杀题目,觉得这个人尽从理论来考虑问题,不从实战出发,这样一本书学精了,到实际运用时,还是"拔剑四顾心茫然",而且现在的win32系统采用 flat 模式,段寄存器已经被遗忘了。

先生有什么好介绍。
2006-3-21 19:27
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
lbool朋友,你可以看看第一问和第二问。
我没有QQ。

我觉得学习汇编,应该首先熟练寻址方式,写出一段代码,一眼都要看明白它的寻址方式,其次是对标志位的熟悉,一段代码的运算结果,对标志位的影响一定不能少。

等我看完这本王爽编写的《汇编语言》后,我觉得最应该看的就是杨季文编写的那本黑皮的《80X86汇编语言程序设计教程》,配合网上有一套视频教材一起学习,就能摸索出来。
2006-3-21 19:41
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习的初期是最痛苦的,特别是对于自学,稍微遇到一点儿问题或者干扰,就放下了,有时候是自暴自弃,遇到问题,自己觉得很困难,可是别人总觉得简单,也没人愿意回答,容易受到打击。我都是因为学习汇编遭受过N多次的这样遭遇后,才埋头看书,疯狂的下载很多东西后,才发现,自己白白的浪费了时间,因为那些东西都不适合自己。

lbool朋友,你看看如果mov ax,cs的话,那么,是不是无法初始化ax了呢?此时的cs是多少?为什么会是cs呢?
这个例题是训练[bx]和loop指令的,所以,你应该先完成第一个问题和第二个问题。
64是根据问题给出的需要循环和写入要求来的。
2006-3-21 19:53
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mov ax,cs可以,没有什么问题,它是指向正在执行指令的段地址,就是代码的开始位置啊。第2个空用数的也只有16H个字节。

第2题我已经做在楼上了,就是你2月份问得那个问题。
2006-3-21 20:01
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
20
最初由 Kven 发布
学习的初期是最痛苦的,特别是对于自学,稍微遇到一点儿问题或者干扰,就放下了,有时候是自暴自弃,遇到问题,自己觉得很困难,可是别人总觉得简单,也没人愿意回答,容易受到打击。我都是因为学习汇编遭受过N多次的这样遭遇后,才埋头看书,疯狂的下载很多东西后,才发现,自己白白的浪费了时间,因为那些东西都不适合自己。


我也是自学的汇编语言, 对Kven朋友的话深有同感啊, 只可惜一旦过了初期的那一"关", 就很难体会到当初的那份感觉了, 所以说, 很多步入"高手"的人就不大愿意回答新手的问题
我的水平不高, 但是我相信, 大家共同进步才是真正有利于论坛发展的

另外对gzgzlxg朋友的话解释一下:
gzgzlxg朋友是从实用角度来说的, 毕竟, "DOS已死"(<<Windows 95 System Programming SECRETS>>侯杰译本), 继续把精力放在上面是一种浪费, 16位段基址*16+16位偏移=20位物理地址的寻址方式早已成为过去, 即使你对此研究得再透也没有地方可以应用. 但是, 从学习的角度来说, Dos下的汇编仍有可取之处. 首先, 学习汇编语言主要的目的是让你明白计算机软件的底层的工作方式和原理, 例如段基址+偏移的思想(分段式存储管理)是很多硬件和操作系统平台所共有的, 拿IA32的保护模式来说也是如此, 只不过它的段基址已经不是简单从段寄存器中得到的, 而是从段描述符中得到, 但是这种思想却没有改变, 对于中断也是如此. 其次, 就汇编语言本身而言, 一些经验和技巧是永远不会过时的(除非IA32体系淘汰), 例如字符串操作技巧, 运算技巧等. 最后, 由于任何编程语言都不可避免要和操作系统打交道, 而Windows系统把一些底层东西封装太深, 如中断, 用户模式程序根本无法使用中断(总不能让新手一开始就学写内核模式驱动程序吧). 不利于后继知识(如操作系统, 任何讲操作系统的书都会讲中断的)的学习

所以我认为, 学习Dos的汇编要重点掌握那些于Dos无关的东西(简单讲就是不涉及int 21h的东西), 如指令的使用等, 为后继学习打下一个基础, 对于那些和Dos操作系统关系太密切的东西(如Dos中断)只要了解原理就行了, 不要深究
2006-3-21 21:56
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
谢谢 thebutterfly 大哥的指点。

lbool朋友,按照你的mov ax,cs来进行数据初始化的结果,mov cx,这里就没法进行计数了,不知道该填多少了。我觉得这道题有问题。
这个论坛好像限制发贴数量,昨天看着问题干着急,就是不让回复。

我这个程序,好像没你那个好。你是直接初始化的时候就把200h给ax了,而我把ax初始化成0了,所以,在设置循环的时候要弄个[bx+200h]。
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,0
mov cx,64
s:mov [bx+200h],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
2006-3-22 09:29
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
22
先生有什么好介绍。

我学计算机是从工控(z80系列)开始,当时(83年左右)根本就没有教材(只有一本z80的指令手册),也没有编译器,也没有计算机(只有工控使用的单板机),所有代码都是直接用16进制数输入的,而且一直要写到最底层(将原来单板机的BIOS去掉了),单板机从启动自检开始,包括控制键盘(读键盘阵列,去键盘抖动)、打印机(包括自己制造汉字)、各种阀门(阀门控制流量的算法还很复杂是一个微分算法)、各种温度也压力感应器等全部都是一手包办,而且只有我一个人,想问个问题都不知问谁去。一直到今天,也没有读过一本关于汇编的教材,所以没有办法推荐什么好书。正因为如此,也养成习惯,不管学什么语言,只读指令手册,绝对不看教材,不看参考书,这可能就是最好的教材。
2006-3-22 12:00
0
雪    币: 214
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
爽的书比较起来初学还是不错的,虽然有点?嗦,但可以原谅,别的比较出名的书连如何编译都不讲,一起来就是一大堆代码,让人无从着手,因为涉及知识太多,每一点你都要知道才能看明白,让人觉得汇编几乎是天书,爽的书由简单的指令入手,写的代码不会用没有教到的指令,所以比较好理解。看来写书也要点功力,不是技术高的书就写的好。

gzgzlxg朋友所说,我并不完全赞成,以前是没有教材,没有参考书,才只能如此,但现在有条件了,为什么不站在巨人的肩上呢,这不是更有效率的做法吗?并不需要每个人都经历钻木取火的痛苦,但前提必须是好书。

Kven,你的s:mov [bx+200h],al中的al根本没有变化,一直都是0,不符合题目要求依次传送数据0-63。
2006-3-22 13:04
0
游客
登录 | 注册 方可回帖
返回
//