汇编基础问题(有答案。求解释)

借助大家的力量。不用全会。会多少请回答多少。一起帮忙~急!!!

每道题我都附上了最终答案。但是个人有很多不解的地方。请朋友们针对我的提问回答。不要答非所问。

我会再加分的!
先谢谢每一位回答问题的朋友!3Q~~

Q1:DW ‘AB’将依次在内存中从低字节到高字节存入的数据:()
答:BA
比较题:DB ‘ABC’将依次在内存中从低字节到高字节存入的数据:()
答:BA
我的问(1)上面是两个题的比较。我很郁闷。是不是第二题的答案给错了啊?为什么C没了呢?
(2)第一个题。若是改成‘ABCD’的话。是不是答案就是:DCBA了呢?

Q2:与LEA BX,BUF指令完全等效的指令是:
A。mov BX,BUF B。LDS BX,BUF C。MOV BX,WORD PTR BUF
D。MOV BX,OFFSET BUF 答:D
我的问(1)C和D有什么区别?我知道一定不选AB。那为什么不选C呢?

Q3:程序分析题
HTOA PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
HTOA ENDP
请回答:1。若执行子程序前AL=09H,执行后AL=()
2。若执行子程序前AL=0DH,执行后AL=() 答:1。39H 2。44H
我的问(1)DAA是什么意思?
(2)请把每一条指令解释一下。
比如 AND AL,0FH就是当AL=09H时,09H与0FH做与。结果AL=99H了。

Q3:指令的操作中,允许出现表达式,例如:BUF1与BUF2均为变量名,下面指令中语法正确的是:(D)
A。MOV AX,BUF1*BUF2 B。MOV AX,BUF1/BUF2 C。MOV AX,BUF1+ES:BUF2 D。MOV AX,BUF2-BUF1
我的问(1)为什么选D。其他的怎么不对?

Q4:伪指令DAT DB 12 DUP(3 DUP(?),0)占用了()字节单元?答:48
我的问(1)怎么算出48的?
(2)若题改成:DAT DB 12 DUP(3 DUP(?),2)那答案是不是依旧为48?不是的话怎么算?
(3)DAT DB 12 DUP(3 DUP(5),2)又是什么答案呢?

Q5:设AL=04H,BL=0F8H,执行IMUL BL指令后,结果为(D)
A。0032H B。00E0H C。03E0H D。0FFE0H
我的问(1)我就是怎么算都不是D答案= =我每次要么算成83E0H。要么算是FC20H。。。请教朋友们了

我问的有点多~请朋友们帮帮忙~急用!!
感谢所有答题的朋友~不过分数只能给一个人。
a64212207你的第一题回答错了~比较问题的答案是给错了。但不是你说的那种。是ABC。还有Q4是48。没错~
wdlglb谢谢你的第五题~

Q1:DW ‘AB’将依次在内存中从低字节到高字节存入的数据:()
答:BA
比较题:DB ‘ABC’将依次在内存中从低字节到高字节存入的数据:()
答:BA
我的问(1)上面是两个题的比较。我很郁闷。是不是第二题的答案给错了啊?为什么C没了呢?
答:第二题的答案给错了,正确的是:ABC
(2)第一个题。若是改成‘ABCD’的话。是不是答案就是:DCBA了呢?
答:第一题若改成‘ABCD’的话,不会通过编译。DW是定义字(两个字节)数据的伪指令,超过两个字符就意味着超出了字单元所能表示的范围。正确的方法是:DW 'AB','CD',在内存中的存放顺序是:BADC
; ---------------------------------------
Q2:与LEA BX,BUF指令完全等效的指令是:
A。mov BX,BUF B。LDS BX,BUF C。MOV BX,WORD PTR BUF
D。MOV BX,OFFSET BUF 答:D
我的问(1)C和D有什么区别?我知道一定不选AB。那为什么不选C呢?
答:给出的答案是完全正确的。
指令
LEA BX,BUF
的功能是:把变量BUF的有效地址装入BX寄存器,而指令
MOV BX,WORD PTR BUF
则是把变量BUF的第一个字(两个字节),送给BX寄存器。
一个是地址,另一个是地址中的内容。
; ---------------------------------------
Q3:程序分析题
HTOA PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
HTOA ENDP
请回答:1。若执行子程序前AL=09H,执行后AL=()
2。若执行子程序前AL=0DH,执行后AL=() 答:1。39H 2。44H
我的问(1)DAA是什么意思?
答:DAA是十进制数加调整指令DAA(Decimal Adjust After Addition),该指令用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。调整规则如下:
*、如果AL的低四位大于9,或标志位AF=1,那么,AL=AL+6,并置AF=1;
*、如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;
*、如果以上两点都不成立,则,清除标志位AF和CF。
经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。
指令格式:DAA
受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)

(2)请把每一条指令解释一下。
比如 AND AL,0FH就是当AL=09H时,09H与0FH做与。结果AL=09H了。
HTOA PROC
AND AL,0FH ;逻辑与。若AL=09,指令执行后,AL=09
ADD AL,90H ;AL+90H→AL,AL=99H
DAA ;
ADC AL,40H ;十进制数加调整
DAA
RET
HTOA ENDP
; ---------------------------------------
Q4:指令的操作中,允许出现表达式,例如:BUF1与BUF2均为变量名,下面指令中语法正确的是:(D)
A。MOV AX,BUF1*BUF2 B。MOV AX,BUF1/BUF2 C。MOV AX,BUF1+ES:BUF2 D。MOV AX,BUF2-BUF1
我的问(1)为什么选D。其他的怎么不对?
答:变量或标号出现在表达式中,代表的是其地址,而地址的乘、除、加法运算是没有意义的。所以,Intel 8086/8088汇编语言直接禁止这种无意义的表达式。而地址相减却是有意义的,可以求得某个或多个变量所占内存单元的容量,可以求得某程序段所占内存单元的容量。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-11
Q1:汇编里面就是高字节存放在低单元,知道这个就可以了,所以我觉得答案错了,2)也是你说的那样。
Q2:C里用了强制转换,它是把BUF里面的内容转换成字了,并没有把它的地址给BX.
Q3:AND AL,0FH;屏蔽AL的高四位
ADD AL,90H;把AL的低四位与90H相加
DAA ;把相加后的数进行BCD码调整
ADC AL,40H;把调整好的BCD码进行带进位的加
DAA ;再进行调整
RET
DAA就是把相加后的数进行BCD码调整,BCD码是最大为9,超过9就要用BCD进行调整,调整为正确的BCD码。
Q4:因为是字节数,12*3+1应该是37吧,答案没错吗?三个答案都是37.
Q5:IMUL好像要进行符号扩展的,如果是MUL的话答案是03E0,但进行符号扩展后就变成FFE0,高位进行符号扩展。
第2个回答  2009-07-11
Q1.dw有几个字节?DB 有几个字节?.abc又占几个字节??这个搞清楚、就可以了。知道吗?
Q2.C是干什么知道吗?直接把buf的内容转换成word型后移到bx里面。而d是把buf的首地址存入bx里面。lea是取首地址的。。(不知道是段首地址还是什么忘了。自己看书)
Q3.
这题不懂。(算了半天也没算对、、能力有限丢的太久了忘了)不过有关于daa的题目:http://zhidao.baidu.com/question/6809860.html

Q4.3 dup(?)是占3个字节 一个 0也占一个字节单元
那么12 dup (3 dup(?),0)就占 48个 里面的内容是
前3个字节是随机的紧接着一个是0.后面还有11个这样的单元、一共是48个字节
无论后面的那个是不是0它是占一个字节的、(不管是2还是其他的所以都是48个字节)
对于dup指令你看书应该有详细的介绍啊。
Q5.
00000100 * 11111000(负数)00000111=00001000
也就是4*(-8)= -32
32 = 00100000
取反11011111
加一11100000
加ff是扩展的因为是负数前面的
所以结果是0FFE0H
你可以把它变换成负数来看看、

PS:个人理解,仅供参考.
相似回答