清风2012 发表于 2018-4-26 21:52:51

汇编作业第五章实验4【bx】和loop的使用第三题

   我在论坛上也看了其他人对这个问题的解答,但还是不太明白:

1、循环的次数,也就是说应该循环几次?

2、有人将循环的次数放入cx,也有人将字节数放入cx, 可这样一来,CPU如何判断cx中的值是循环此时还是字节数?

3、通过debug跟踪发现每条指令所占的字节并不完全一样,有的占1个字节,有的占2个字节,也有的占3个字节。我
一直以为这是系统自动分配的,可对于我们程序员来说如何才能知道字节的数量?

57158597@qq.com 发表于 2018-4-26 21:52:52

1,循环次数就是循环几次,比如:
                        mov cx,8       ;循环8次
                        mov ax,0
                  s:    inc ax            ;ax=ax+1
                        loop s            ;执行结果ax进行了8次+1所以,ax=8

2,cx是个寄存器,可以拿来放你想放的任何数据,不一定要放循环次数 ,但你要用LOOP的时候CX里面的值就会直接被CPU认为是循环次数,一般情况下CX都是用来放循环次数的

3,像mov ax,0占3个字节,mov ax占一个字节,用B8表示,ax是个十六位寄存器,它的值肯定要占2个字节也就是0000,所以就是3个字节了,同理:mov cx,8也占3个字节,mov cx占一个字节,用B9表示,cx是个十六位寄存器,它的值肯定要占2个字节也就是0008(debug值上显示应该是0800,低位在前)。如果你是为了算循环的跨度大可不必这样,汇编的编译器会自动帮我们算的,不用我们操心,在后期也可以用offset a - offset b得出跨度的字节数

持恩 发表于 2018-6-2 22:22:09

今天偶尔点到汇编这个讨论看看的,看你问了那么久我也不知道你还学不学了,但是秉持着严谨的态度。 我觉得还是将这个问题回复一下。

assume cs:codesg

codesg segment
        start:                mov ax,cs
                        mov ds,ax
                        mov ax,0020H
                        mov es,ax
                        mov bx,0
                       
                        mov cx,18H
                s:        mov al,
                        mov es:,al
                        inc bx
                        loop s
                       
                        mov ax,4c00H
                        int 21H
codesg ends

end start

文中两处标红色的地方是填空的位置。

debug进行调试 -u以后,左侧会显示字节数。字节数就是cx循环的次数,因为cx只记录循环测次数。

shanling2017 发表于 2018-6-4 13:50:27

关于这个CX寄存器,这个不知道楼主用的是那一版本的教材。我用的是王爽老师的第三版的教材。然后,第三版的第91页,第四章第九节,里面谈到了。说,debug讲程序从可执行文件加载入内存后,CX中存放着程序的长度,也就是所占据的字节数。
这就是说啊,你卸了一个会变源程序,然后呢,编译链接之后,你刚刚用debug加载的时候,是这个刚刚加载的时候,你用r命令查看一下,然后呢,这个时候,cx里面,存放着的,就是这个整个程序所占的字节数。这个长度,在cx里面存放着。如果不是在debug里面的话,那么,这个cx里面是会在你写完了源代码之后,里面存放着这个程序的长度,就不好说了。我也没试过,但是啊,你要是编译链接为可执行文件之后,你用debug那么一查,刚开始的时候,你不是还没有执行什么指令码?然后,这个cx寄存器也没有什么修改。这个时候,cx寄存器里面,所存放着的。就是那个程序的长度,就是所占的字节数。
暂时不考虑其他的条件的话,那么,这个cx存放着程序的字节数,你可以暂时理解为,只有在debug调试跟踪的初始状态下,它是表示着这个程序的字节数的。然后呢,你自己用的时候,比较常见的一个用法,就是用它来设置循环次数。应用的场合不一样。一个是,debug跟踪调试的出事场合下,它是里面存放着程序的字节数。另一个,就是你自己在编程的时候,在源代码里面,你会设置cx的数值,这个,一般的,是将它作为循环次数来试用。暂时,你就可以先这么理解着。

shanling2017 发表于 2018-6-4 13:55:23

接下来呢,就是那个程序题,你怎么去做的问题。首先啊,这个cx存放着这个程序的字节数,这个字节数,包含了mov ax,4c00h,也包含了int 21h,然后呢,这个后两者结束返回的指令,它们俩所占的字节数,这个你用u命令一查,很快地就查到了。然后呢,想要求这个题目中要求的字节数,那么,你就把cx里面的数值,减去这个mov 4c00h,还有int 21h,把这两条指令的字节数给减去,然后就完事儿了。如果程序的字节数再多一些,也是一样。cx的数值减去结束返回语句的长度,就求出来了。做题的时候,你可以先不去说一下子就想要知道吧cx设置成多少。随便填一个数就行,0啊,1啊,100啊,都行,随便填一个。然后呢,debug跟踪调试一下,就得到了初始的这个cx的数值,就是那个总长度,你再把它减去那个结束返回语句的字节数,就得到了要复制的这个长度了。这个题,也就算是完事儿了。

他非她 发表于 2018-6-5 21:48:52

这道题我也刚刚做好,在CMD窗口里执行debug这个可执行文件后,马上R命令,CX的值是001D,说明这个程序占用了1DH(29)个字节,再使用U命令查看CS:IP开始部分的内存单元,可以看出最后的两行指令mov ax,4c00h(B8 00 4C)和int 21h(CD 21)共占用了5个字节,也就是说,除去这两个命令,前面的十行命令占用了24(18H)个字节。我把程序第六行填为mov cx, 001dh,在debug中运行后查看0020:0开始的内存数值,却发现mov ax,4c00h和int 21h这最后两行指令所占的5个字节内容和开始的不一样,变为了CC 00 4C CD 21,使用U命令查看,显示为int 3(CC)、add ,cl(00 4C CD)、and ,ax(21 00)的语句,试了几次都这样。好奇怪B8 00 4C怎么会变成CC 00 4C ? 不知哪位大神可解其中奥妙?
页: [1]
查看完整版本: 汇编作业第五章实验4【bx】和loop的使用第三题