首页
社区
课程
招聘
[求助]汇编初学者,问个 王爽汇编 课后习题的 问题(结贴)
发表于: 2009-5-8 12:07 5252

[求助]汇编初学者,问个 王爽汇编 课后习题的 问题(结贴)

2009-5-8 12:07
5252
劳烦大家帮我看不明白的地方:

下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code

code segment
     mov ax,code  ;code为所填写的数据
     mov ds,ax
     mov ax,0020h  ;这儿的0020h哪来的   
     mov es,ax
     mov bx,0
     mov cx,18h   ;18h为所填写的数据,18是怎么算来的
s:   mov al,ds:[bx]
     mov es:[bx],al ;这儿两句不知道要干什么
     inc bx
     loop s
     mov ax,4c00h
     int 21h
code ends
end

我根本不知道第一句 mov ax,code  是什么意思

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 252
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
第一句就是把代码段段地址给ax
mov ax,0020h  ,你不是要放到0:200吗? (0x20<<4) + 0 不就是这个地址吗?
mov cx,18h , 看机器码了,mov ax,4c00h前面刚好0x18个字节。
s:   mov al,ds:[bx]
     mov es:[bx],al ;
这儿两句就是把“mov ax,4c00h”之前的指令复制到内存0:200处
2009-5-8 12:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我明白了,刚才在debug中看明白了。 还有个疑问是  内存地址 0:0200 是如何得到 段地址(es)=0020 的?
我只知道 段地址x16+偏移地址=物理地址
那么  0020x16+0000=0200:0000  ,它怎么和 内存地址 0000:0200 勾搭上的??
2009-5-8 12:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
另 万分感谢 szwyf 给初学者的 帮助
2009-5-8 12:51
0
雪    币: 252
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
0x20:0 和0:0x200 表示的都是同一个内存地址,都是表示物理地址0x200。
2009-5-8 14:05
0
雪    币: 694
活跃值: (550)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
王爽的汇编写得很详细,我现在也正在研究中.
2009-5-8 14:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵 我也 正在 学习中 啊
2009-5-8 14:45
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个都不明白 只能说你看书没看到份上,如果你汇编没什么基础的话就慢慢来不要着急。王爽的书我觉得写的真的非常详细。
2009-7-17 21:46
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还能回复不?
2009-7-17 22:36
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好的,这个是这样子的。
     (1)assume cs:code 是把cs段地址和code联系起来
              其中下面的 mov ax,code  ;code为cs段地址
     (2)不是要把指令复制到0:200h得地方吗?那么根据段地址*16+偏移地址,那么得出es为20h
       (3)mov cx,18h   ;18h为所填写的数据,18是怎么算来的
          这个18是这样计算得来的,计算机把汇编指令变成操作码,opcode,这样子move指令一般是2个字节,loop和inc都是单字节,计算机下来在mov ax,4c00h之前一共有18个字节,所以cx为18。
          传输的时候也是按照单字节来进行传输的。
      (4)s:   mov al,ds:[bx]
     mov es:[bx],al ;这儿两句不知道要干什么
     inc bx
     loop s
              从 s:到loop s是一个循环语句,前面两句就是传输语句,由于8086不支持从内存到内存的传输,所以要使用寄存器进行传输。
      解答完毕,有不明白了再问吧。
2009-7-17 22:44
0
游客
登录 | 注册 方可回帖
返回
//