zjhwasd 发表于 2013-12-10 20:10:20

王爽汇编语言实验4【bx】与loop的使用

本帖最后由 zjhwasd 于 2013-12-10 20:26 编辑

我给大家附上图片,然后把答案也附上答案真的让人费解,小弟不懂,所以特发此贴求解释,真心谢谢各位了 不懂啊 还有不懂得一点是 cx为17他和后面s 后面的代码就没有什么关系啊, 为什么还要写出来 mov cx 17h 实在是不懂,希望大牛可以解答下这个疑问。

~逆天~ 发表于 2013-12-11 09:37:44

1、mov ax,cs
      mov ds,ax
这句是将当前CS段地址复制给DS,也就是让数据段的指向代码段作为复制的源数据,为什么呢,因为题目要求是复制代码段的数据
2、mov cx,17h
如果我没猜错的话,这个17H就是从代码入口处(这里没指名程序入口,代码段开始mov ax,cs默认程序入口)到loop s结束的指令长度

zjhwasd 发表于 2013-12-11 17:50:23

~逆天~ 发表于 2013-12-11 09:37 static/image/common/back.gif
1、mov ax,cs
      mov ds,ax
这句是将当前CS段地址复制给DS,也就是让数据段的指向代码段作为复制的源数 ...

2、mov cx,17h
如果我没猜错的话,这个17H就是从代码入口处(这里没指名程序入口,代码段开始mov ax,cs默认程序入口)到loop s结束的指令长度

第一个题的答案我看懂了, 至于第二个问题,我还有点疑问,cx 这个寄存器起的什么作用 他有什么用呢?


程序的入口处是 cs:ip   那么代码的入口处 应该怎么表示?总感觉cx 这个就没什么用

~逆天~ 发表于 2013-12-12 10:25:36

zjhwasd 发表于 2013-12-11 17:50 static/image/common/back.gif
2、mov cx,17h
如果我没猜错的话,这个17H就是从代码入口处(这里没指名程序入口,代码段开始mov ax,cs默 ...

程序入口处=代码入口处,这两个是一个意思,不等于代码开始处,指定程序入口使用end 标号,标号在哪里,CS,IP就定位到哪里,从那里开始执行。CX肯定是有用的,它是控制LOOP循环次数的。

T_未命名 发表于 2013-12-12 11:38:12

mov cx 数字
...
...
loop s

mov cx 数字的内容就是循环几次嘛
刚才看的时候突然也给忘了还想了好一会
LOOP指令 就是先将cx减1,然后再判断cx是否为0
如果为0 就跳出循环

zjhwasd 发表于 2013-12-12 18:09:09

T_未命名 发表于 2013-12-12 11:38 static/image/common/back.gif
mov cx 数字
...
...


这个我懂 可是就是不知道17 是怎么来的

zjhwasd 发表于 2013-12-12 18:10:26

zjhwasd 发表于 2013-12-11 17:50 static/image/common/back.gif
2、mov cx,17h
如果我没猜错的话,这个17H就是从代码入口处(这里没指名程序入口,代码段开始mov ax,cs默 ...

你说的 大部分是懂了17h 是怎么来的?怎么计算的?有没有公式?

dancene 发表于 2013-12-12 18:24:56

本帖最后由 dancene 于 2013-12-12 18:30 编辑

17H,
是mov ax,4c00h 前代码占的空间大小,
一共23个字节。。换成16进制就是17H
想知道怎么算的, debug 你的程序,
然后用u命令查看

zjhwasd 发表于 2013-12-12 19:35:31

dancene 发表于 2013-12-12 18:24 static/image/common/back.gif
17H,
是mov ax,4c00h 前代码占的空间大小,
一共23个字节。。换成16进制就是17H


你怎么知道是23个字节呢?还有救是 mov ax,4c00h 前代码占得空间怎么计算 求教

T_未命名 发表于 2013-12-12 22:31:35

zjhwasd 发表于 2013-12-12 19:35 static/image/common/back.gif
你怎么知道是23个字节呢?还有救是 mov ax,4c00h 前代码占得空间怎么计算 求教

为什么我数了半天都是24....

zjhwasd 发表于 2013-12-13 19:31:19

T_未命名 发表于 2013-12-12 22:31 static/image/common/back.gif
为什么我数了半天都是24....

起码应该是个偶数字节吧

无名侠 发表于 2013-12-14 08:55:12

ds不可以直接赋值,所以要用AX来做中转。

zjhwasd 发表于 2013-12-16 16:55:25

无名侠 发表于 2013-12-14 08:55 static/image/common/back.gif
ds不可以直接赋值,所以要用AX来做中转。

这个我是知道的,我的问题在图上呢。

1236 发表于 2013-12-17 00:48:46

二货,不错啊,都看到中断了,既然被我看到你了,就简单跟你说下
assume cs:code

code segment
        mov ax,cx          ;段寄存器赋值,要通过通用寄存器中转
        mov dx,ax                ;这里是把代码段的地址给了数据段寄存器
        mov ax,0020h
        mov es,ax                ;0:200其实就是 20:0   这里es当做20:0处的段地址es是段寄存器,ax中转一下
        mov bx,0         ;偏移从0开始,也就是ds:0换句话说 也是cs:0
        mov cx,17h      ;为什么是0x17,因为mov ax,4c00h上面的机器码总共占了0x17个字节
s:        mov al,      ;从20:0处开始赋值了,因为bx默认段寄存器是ds
        mov es:,al        ;传递字节传递给20:0   
        inc bx               ;下一个字节
        loop s            ;一直循环   知道cx为0
        mov ax,4c00h
        int 21h
       

code ends
end

戏++ 发表于 2013-12-17 09:07:22

17h表示需要复制的指令字节数从cs:0开始算,到cs:17h为止
s到loop s表示循环拷贝17h次把指令一个字节一个字节的复制过去
cx控制的是循环次数,这个不明白可以看下小甲鱼的视频

zjhwasd 发表于 2013-12-17 18:38:20

1236 发表于 2013-12-17 00:48 static/image/common/back.gif
二货,不错啊,都看到中断了,既然被我看到你了,就简单跟你说下

寸芒兄弟来了,谢谢指导,完全懂了。哈哈 谢谢了。我会继续努力的。 你的这个id 还真不好找你。

霸气外露 发表于 2013-12-18 03:45:22

T_未命名 发表于 2013-12-12 22:31 static/image/common/back.gif
为什么我数了半天都是24....

如果是18H的话,那你第一个空写的是mov ax,code

全杨华 发表于 2013-12-18 10:53:59

谢谢楼主分享

大娱乐家_╮ 发表于 2013-12-18 13:48:17

完全懂了。哈哈

菜鸟一个a 发表于 2013-12-28 17:16:42

xxx学习学习再学习
页: [1] 2
查看完整版本: 王爽汇编语言实验4【bx】与loop的使用