注册 登录
编程论坛 汇编论坛

汇编语言程序设计的几个题目

a261935348 发布于 2012-05-29 12:41, 1280 次点击
P65
第一题,  VAR1 DW 1234H 89 ,255,-2,-0AH          以字为单位 存储
          VAR2 DB 34,78H,44,22,19,-12            以字节为单位
             .
            .
            .
          MOV AH ,23H                            将23H 移动到 AH
          LEA BX,VAR1+4                          LEA近地址写入寄存器,在VAR1+4的地址数(-0AH吗?)移动到BX
          MOV AL,BYTE PTR [BX+1]                 PTR是什么意思不太了解,命令符号多了就搞不清楚了,把BX+1地址下的内容送到AL
          MOV SI,WORD PTR VAR2+3                 VAR2+3的数值22送到SI  
    程序段执行后AX=_____,SI=____  答案 23FFH   1316H  现在的题目感觉更难了!后面的中文为我自己的理解有错误的帮忙指出谢谢!一点都不明白他的答案是怎么出来的!

第二题, BUF DW 1,0,0AB1CH,582H,9,3A04H,9,0

         LEA DI,BUF                  把BUF的第一个地址放入DI
         MOV CX,8                    8放如CX
         MOV AX,9                    9放入AX
         REPNZ SCASW                 不懂这句
         JNZ K1                      结果不为零直接跳转到K1
         SUB DI,OFFSET BUF          OFFSET是偏移量什么DI下的数字减去BUF?                                                                                      
         MOV DX,DI                   DI的数移动到DX
         SUB DI ,OFFSET BUF           DI减去BUF                                             
         MOV DX,DI                 DI移动到DX
         SHR DX,1                算术右移一位
         ADD DL,30H               30H加DL放入DL
         MOV AH,2                 2移动到AH
     INT 21H                       显示
   K1:....
上述程序执行后:(1)程序完成什么功能?(2)显示输出的是什么值?     老样子文字是我自己的理解当中有几句关键的命令不懂所以感觉完全看不懂!

      
22 回复
#2
有容就大2012-05-29 13:32
先讨论第一题
 ; 我也刚学 不对的地方请路过的大牛指出来 免得误了人。
VAR1 DW 1234H 89 ,255,-2,-0AH  后 VAR1 连续存储空间的 布局是
下标  内容
0     34H
1     12H
2     59H
3     00H   ;89的字分布是 0059H
4     FFH  
5     00H   ;对应255
6     FEH
7     FFH   ;对应-2
8     F6H
9     FFH   ;对应-0AH

VAR2 DB 34,78H,44,22,19,-12 后 VAR2的内存分布是
22H
78H
2CH
16H
13H
F4H


MOV AH ,23H                            将23H 移动到 AH
LEA BX,VAR1+4                          LEA近地址写入寄存器,在VAR1+4的地址数(-0AH吗?)移动到BX
                                       VAR1 + 4 应该是指向FFH 作为低字节传给BL VAR1+5 = 00H 传给BH
                                       所以 BX = 00FFH
MOV AL,BYTE PTR [BX+1]       这里的BYTE PTR 就是传一个字节给AL的意思 [BX + 1] 刚好指向FFH 因为BX = 00FFH
所以 AH = 23H AL = FFH AX = 23FFH

MOV SI,WORD PTR VAR2+3   
VAR2+3 指向 16H  WORD PTR要求传一个字 所以SI的低位是 VAR2+3 高位是VAR2 + 4 = 13H
所以 SI = 1316H

第2个 还没学好 不敢乱说 同求大牛解答。
#3
hellovfp2012-05-29 13:36
repnz/repne scasw 前缀可以理解为"当数据串没有结束(CX不等零),并且串不相等(zf等于零),则继续比较"
#4
有容就大2012-05-29 13:42
以下是引用hellovfp在2012-5-29 13:36:22的发言:

repnz/repne scasw 前缀可以理解为"当数据串没有结束(CX不等零),并且串不相等(zf等于零),则继续比较"
大哥你来的太及时了 现在学汇编好费脑子啊
什么时候能比较轻松的看win32汇编啊
以后有什么要多向你请教
我先去做做第2道 看能不能拿下来。
#5
有容就大2012-05-29 13:55
发现我上面的回答有个矛盾
程序代码:
LEA BX,VAR1+4                          LEA近地址写入寄存器,在VAR1+4的地址数(-0AH吗?)移动到BX
                                       VAR1 + 4 应该是指向FFH 作为低字节传给BL VAR1+5 = 00H 传给BH
                                       所以 BX = 00FFH
MOV AL,BYTE PTR [BX+1]       这里的BYTE PTR 就是传一个字节给AL的意思 [BX + 1] 刚好指向FFH 因为BX = 00FFH
--
如果 BX = 00FFH 那么 [BX + 1] 是不是应该指向高位 00H 因为 BX 的分布是
FFH
00H

那么 VAR1 + 4 指向的是 OOH 还是 FFH?
我也糊涂了。



[ 本帖最后由 有容就大 于 2012-5-29 13:57 编辑 ]
#6
a2619353482012-05-29 15:47
回复 4楼 有容就大
哈哈 第一道看懂了~每次都靠你帮忙哈~
#7
有容就大2012-05-29 15:53
回复 6楼 a261935348
应该还有点问题 你可以再想想

VAR1 DW 1234H 89 ,255,-2,-0AH  
LEA BX,VAR1+4   

VAR1 是按字来的 那么 VAR1 + 1 是按一个字走还是按一个字节走 如果按字节走推出的就不符合你的答案
按字走的话  LEA BX,VAR1+4 后 VAR1+4指向F6H [BX] = F6H 那么 BYTE PTR [BX + 1] = FFH才对 我现在就想去证实这个。

[ 本帖最后由 有容就大 于 2012-5-29 15:54 编辑 ]
#8
a2619353482012-05-29 16:03
回复 5楼 有容就大
难道是答案错了么 毕竟练习册也是人做出来的 我感觉你推的听正确的啊!
#9
有容就大2012-05-29 16:04
我去 证实了下 VAR1 + 1 走的是一个字节 BYTE PTR [BX + 1] = 00H才对
只有本站会员才能查看附件,请 登录
#10
zklhp2012-05-29 16:08
太长看不懂 帮顶了
#11
a2619353482012-05-29 16:11
回复 9楼 有容就大
顶~牛B  你用的什么软件呀?
#12
有容就大2012-05-29 16:12
回复 10楼 zklhp
那我向你确实下

VAR1 DW 1234H 89 ,255,-2,-0AH  
LEA BX,VAR1+4

VAR1 + 4 走几个字节?也就是说偏移量怎么算?对于 DW的定义。
#13
有容就大2012-05-29 16:14
回复 11楼 a261935348
XP自带的 虚拟DOS平台。你的机器也有啊
不会光看书不敲代码吧。
#14
zklhp2012-05-29 16:17
以下是引用有容就大在2012-5-29 16:12:14的发言:

那我向你确实下

VAR1 DW 1234H 89 ,255,-2,-0AH  
LEA BX,VAR1+4

VAR1 + 4 走几个字节?也就是说偏移量怎么算?对于 DW的定义。

应该是走4字节 也就是-2那个
#15
有容就大2012-05-29 16:23
以下是引用zklhp在2012-5-29 16:17:17的发言:


应该是走4字节 也就是-2那个
一个字节不是对应2个16进制位 (8个二进制位)那么一段内存
下标  内容
0     34H
1     12H
2     59H
3     00H   ;89的字分布是 0059H
4     FFH  
5     00H   ;对应255
6     FEH
7     FFH   ;对应-2
8     F6H
9     FFH   ;对应-0AH
从0走4个字节应该是 指向FFH 也就是255 怎么会是-2呢 不太明白啊。
#16
zklhp2012-05-29 16:30
以下是引用有容就大在2012-5-29 16:23:29的发言:

一个字节不是对应2个16进制位 (8个二进制位)那么一段内存
下标  内容
0     34H
1     12H
2     59H
3     00H   ;89的字分布是 0059H
4     FFH  
5     00H   ;对应255
6     FEH
7     FFH   ;对应-2
8     F6H
9     FFH   ;对应-0AH
从0走4个字节应该是 指向FFH 也就是255 怎么会是-2呢 不太明白啊。

对 是到你说的那里 我数的不对

具体以编译器为准啊 你写个代码试试呗
#17
有容就大2012-05-29 19:19
回复 楼主 a261935348
讨论第二题
         LEA DI,BUF                  把BUF的第一个地址放入DI
         MOV CX,8                    8放如CX
         MOV AX,9                    9放入AX
这时 CX = 0008H, ZF = 0
在满足 CX > 0 并且 ZF = 0 的情况下  REPNZ SCASW 就会执行 去调试了下  REPNZ SCASW会改变 AF 和 PF 标志位
其他的标志位没发现改变目前,而且每次 REPNZ SCASW都会使CX - 1  , DI + 2. 还不知道ZF标志位在什么情况下会改变,hellovfp大哥说的 ‘并且串不相等(zf等于零),则继续比较 ’里的串在这里有没有体现?
但是确定的情形是 当 CX 减到0时 JNZ K1就执行了 所以 我认为你给的题目不全 后面K1应该还有内容 ,不然程序无法输出东西的。后面是不是还有啊?
#18
a2619353482012-05-30 12:43
回复 17楼 有容就大
没有啦K1后就只有... 就到这里结束了 答案是:   (1)从数据表中找出第一次出现值为9的元素
                                            (2)显示输出该元素在BUF中的位置=5
#19
有容就大2012-05-30 13:22
去调试了下

 MOV AX,9                 
 REPNZ SCASW
这个并没有实现 AX 中的内容与数据段的内容比较的功能 只是在CX减为0后JNZ就跳转了。ZF的标志一直是 NZ。

同求大牛来帮忙解释你书上的答案。

还有个问题是入在CX减为0之前找到了相同的数 ZF = 1那么REPNZ SCASW 停止, JNZ 立即跳转 到K1也不会有输出
功能出现啊 你好好看下书上给的那个习题 你有没有抄错 ?
#20
于祥2012-05-31 13:21
回复 19楼 有容就大
      MOV AH,2                 2移动到AH//这里是用21H中的2号功能
      INT 21H                       显示
 这个就是输出显示,这是21H功能调用,你可以看一下DOS中断及功能调能调用
#21
于祥2012-05-31 13:37
把这句改一下JNZ K1改成JZ就可以了。找到的话,zF应该为1,但是我编译器里边显示的为0,有点儿搞不懂了!                     
#22
有容就大2012-05-31 13:52
回复 21楼 于祥
ZF 在CX为0之前一直是0的 也就是说没找到 JNZ变成JZ后输出的是 8 不是 5.
#23
于祥2012-05-31 22:52
回复 22楼 有容就大
额,我没顾忌到答案是否正确,有点儿水了。我只顾到是否能得到答案啦!
1