佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: fxam

【常见问题】x86组合语言Assembly Language连接索引

[复制链接]
发表于 9-9-2005 10:08 PM | 显示全部楼层
存起来是指放在某一个位址 ( address )


大概是这样:

mov [ds:0000], 0
mov [ds:0002], 1

mov bx, 0000
mov cx, 次数

test:

mov ax, [ds:bx]
add ax, [ds:bx + 2]
mov [ds:bx+4], ax
add bx, 2
loop test

然后显示 ds:0000 到 ds:bx + 4 的数值

備註:
ds != cs
回复

使用道具 举报


ADVERTISEMENT

发表于 10-9-2005 01:37 AM | 显示全部楼层
哦,对有这个[ ]就是save在address里,但我还是不会分。。因为一开始basic时就已经很乱了。。
我有用你提供的comand放在emu8086试,但第一个comand就出现error。。

如果你有时间,可以大约讲解每个步骤吗?我不是在等答案,只是basic不好,所以不太明白。。

还有,为何下面要+4呢?
回复

使用道具 举报

发表于 14-9-2005 01:12 AM | 显示全部楼层
最基本的也不会?你好像连CS和DS都不懂, 那我帮帮你吧。

Flag是用来显示一些“状况”,例如:SF用来显示负数,OF显示overflow。
不同的指令都会出现不同的Flag。例如:加法和减法,当运算结果是零时就会出现ZF,数目太大就会有OF等等。对初学者,要把flag弄清楚并不容易。

首先,flashang的程序有作一个假设,CS不等于DS。

CS和DS都是segment register,除了这俩个之外还有ES和SS。
CS是程序码的部分,DS是数据的部分。
通常我们可以用以下的方法来表示记忆体的位置:

mov AX, CS:[BX]      (假设BX=5),代表CS部分的第5个的记忆体
mov AX, CS:[0100]      CS部分的第100H的记忆体
mov AX, DS:[SI+4]      DS部分的第SI+4的记忆体

假设CS=DS=ES=SS,那么我们就可以省略掉segment register,像这样。
mov BX, 200      BX储存我们要的数值200。
mov [BX], 200     BX的数值是记忆体位置。这个记忆体位置才是用来储存200。

挂弧的差别是,一个是直接储存数值,另一个是记忆体位置。

加二是要读取后两个bytes,作用是移位到下一个记忆体位置。
加四是要读取那两个bytes之后的两个bytes (就是移位到下两个记忆体的位置)。

最后的loop指令是用来作“looping”。
只要CX不等于0,就会跳回test那里,跳到mov ax, [ds:bx]那个指令。
loop指令会把CX减一。
回复

使用道具 举报

发表于 14-9-2005 10:39 AM | 显示全部楼层
关于flag,那天我已经搞清楚了,但偶尔还会有少少不明白。。对于CS,DS这些东西却是非常模糊
回复

使用道具 举报

发表于 14-9-2005 11:44 AM | 显示全部楼层
原帖由 meemee 于 14-9-2005 01:12 AM 发表
最基本的也不会?你好像连CS和DS都不懂, 那我帮帮你吧。

Flag是用来显示一些“状况”,例如:SF用来显示负数,OF显示overflow。
不同的指令都会出现不同的Flag。例如:加法和减法,当运算结果是零时就会出现 ...

谢谢指导。。不过为何我一开始就load不到以下这个?

原帖由 flashang 于 9-9-2005 10:08 PM 发表


大概是这样:

mov [ds:0000], 0
mov [ds:0002], 1
回复

使用道具 举报

发表于 14-9-2005 08:24 PM | 显示全部楼层
那是什么error,你把它post上来。

试试改成这样,如果这个也有error,也把error post上来。
MOV BX,200

MOV WORD PTR [BX],0
MOV WORD PTR [BX+2],1
MOV CX,次数

test:
MOV AX,[BX]
ADD AX,[BX+2]
MOV [BX+4],AX
ADD BX,2
LOOP test
回复

使用道具 举报

Follow Us
发表于 15-9-2005 02:35 PM | 显示全部楼层
我想可能是他把
mov ax,ds :[0000],0
mov ax,ds :[0002],1
写成
mov [ds:0000], 0
mov [ds:0002], 1
回复

使用道具 举报

发表于 15-9-2005 02:45 PM | 显示全部楼层
好像越来越模糊了,因为很多comand都不会
回复

使用道具 举报


ADVERTISEMENT

发表于 15-9-2005 03:26 PM | 显示全部楼层
我补充一点吧...

其实,一开始flashang假设
1.在ds所指的64KB是free to use的buffer,可以想象成是个64KB的array
2.假定资料是16bit integer(2 bytes),所以可以store32K个value (eg: array[32K], 假定array[index] 就是 [bx])

所以...

接下来的code是这个意思...
array[0] = 0 ;mov word ptr [ds:0],0
array[1] = 1 ;mov word ptr [ds:2],1 '因为是16bit integer (2 bytes),所以要+2
index = 0 ;mov bx,0
cx = 次数 ;mov cx,次数
@test:
ax = array[index] ;mov ax,[bx]
ax = ax + array[index + 1] ;add ax,[bx + 2]
array[index + 2] = ax ;mov [bx + 4], ax
index = index + 1 ; add bx, 2

;loop test
cx = cx - 1
if cx > 0 then goto @test
;end of (loop test)


再补充一下,
如果不指定segment register,default就是DS (eg: mov ax,[bx] = mov ax, [ds:bx])
如果一开始cx=0...那就...

希望帮得到你...

[ 本帖最后由 astral 于 15-9-2005 03:35 PM 编辑 ]
回复

使用道具 举报

发表于 15-9-2005 03:56 PM | 显示全部楼层
现在可以讲,你们所讲的,对我来讲真的很模糊,可以说不知道你们讲什么,我试下和朋友讨论。。

谢谢大家热心指导
回复

使用道具 举报

发表于 15-9-2005 05:04 PM | 显示全部楼层
有那么复杂吗?
其实整段code也只是:

mov, add, loop而已...
回复

使用道具 举报

发表于 16-9-2005 10:33 AM | 显示全部楼层
你们熟悉,当然觉得不复杂。。对我来讲,几时用什么register我也搞不清楚。。
回复

使用道具 举报

发表于 16-9-2005 10:36 AM | 显示全部楼层
我的letcurer说全部人都不会做,他唯有公开答案,指导我们。。但他还没有教完,迟点我把它放在这里,和大家研究。。
回复

使用道具 举报

发表于 28-10-2005 01:24 AM | 显示全部楼层
请问还有什么网页关于8086的吗?
以上很多都进不到。。

多两个星期要考final了,但我还是很blur。。好难!!!
回复

使用道具 举报

 楼主| 发表于 1-11-2005 12:06 PM | 显示全部楼层
> 请问还有什么网页关于8086的吗?
Art of Assembly是很好的教程了: http://webster.cs.ucr.edu/AoA/index.html

还是之前说过的,多练习,多用debugger一步一步走,观察register, flag和memory的变化,就可以学到很多了。不懂再和大家交流。
回复

使用道具 举报

发表于 2-11-2005 01:45 AM | 显示全部楼层
我也是一直观察register/flag的东西,但是也是很不明白。。。太难了。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 20-11-2005 07:02 AM | 显示全部楼层
> 多两个星期要考final
final考完了吧?

最近发觉  VMWare 5 + SoftIce 超好用。一边在VMWare里用SoftIce,一边在主操作系统做其它分析或笔记,不必像以前,开了SoftIce介面就没法子去别的程式。
回复

使用道具 举报

发表于 11-12-2005 06:52 PM | 显示全部楼层
原帖由 DeadCow 于 14-9-2005 10:39 AM 发表
关于flag,那天我已经搞清楚了,但偶尔还会有少少不明白。。对于CS,DS这些东西却是非常模糊

為什麼不用Flat memory model,省掉segment registers。
回复

使用道具 举报

发表于 24-12-2005 03:17 PM | 显示全部楼层
原帖由 fxam 于 20-11-2005 07:02 AM 发表
> 多两个星期要考final
final考完了吧?

最近发觉  VMWare 5 + SoftIce 超好用。一边在VMWare里用SoftIce,一边在主操作系统做其它分析或笔记,不必像以前,开了SoftIce介面就没法子去别的程式。

一早考完了,成绩也出了,只不过很少回来留意。。哈哈。。上次考试只拿B,不过老师都是出些比较theory的问题,如果是些programming问题,可能成绩更差。。

觉得8086真的要用很多时间去了解。。

在此,谢谢大家之前一些指导。。
回复

使用道具 举报

发表于 3-1-2006 12:18 PM | 显示全部楼层

这里很多ASM高手!
我是幼稚园班的,以后请多多指教。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-3-2024 09:00 AM , Processed in 0.079871 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表