类型:转载 责任编辑:asp 日期:2007/03/01
我是汇编初学者,下面几题,我抄下答案,但我不理解.
请大家解释一下程序为什么执行后会得到答案的内容.
(我总分不多了请原凉)
执行下列程序后,寄存器ax,bx和cx的值分别是多少?
org 1221h
num dw 12h
.
.
.
mov ax, num
mov bx, offset num
mov cl, byte ptr num+1
mov ch, type num
hlt
正确的答案是:ax=0012h,bx=1221h,cx=0200h
----------------------------------------------
现有数据段如下:
data segment
org 30h
adr1 db 0,0,30h,0,30h
dw adr1
data ends
构成数据30000h的字存储单元有多少个?
正确的答案是:2个
它们的偏移值分别是多少?
正确的答案是:a. 0030h b. 0033h
----------------------------------------------
现在数据段如下:
d_seg segment
num1 db 12h,34h,56h,78h
num2 dw 10h,11h,21h,31h
db $-num2
db 10h dup (1,2,3)
d_seg ends
.
.
.
mov bx, ds:[0006h]
and bx, offh
and bx, [bx]
hlt
bx=____ 正确的答案是:0313h
---------------------------------------
若(ds)=1500h, (ax)=0c56dh, (cx)=0003h, (psw)=0001h
执行rcl ax,cl指令后,ax寄存器的内容是多少?
正确答案是: (ax)=2b6fh.
推荐阅读
执行下列程序后,寄存器ax,bx和cx的值分别是多少?
org 1221h ;这句表明此句之后的地址从偏移1221h开始
num dw 12h ;所以num的偏移地址是1221h
.
.
.
mov ax, num ;ax=12h(就是0012h)
mov bx, offset num ;此条指令执行后bx=num的偏移地址
mov cl, byte ptr num+1
mov ch, type num ;num是字类型,所以type num=2
hlt
所以:ax=0012h,bx=1221h,cx=0200h
因0在内存中是30h,所以adr1 db 0,0,30h,0,30h相当于
adr1 db 0,30h,30h,0,30h
故第一和第二,第四和第五就形成了字3000h
所以构成数据30000h的字存储单元有2个
不对啊,这第三题的答案为什么是bx=0313h呢!
and bx, offh ;这已经把bx的高字节清0了啊!!
and bx, [bx] ;bx不管与什么数进行"与"操作,高字节也不可能是03啊!!!!!
hlt
所以答案不可能是bx=0313h
num2 的 db $-num2应该怎样理解和计算
$代表当前的偏移量~减去num2,也就等于num2中的字节个数!即 =8
上面说的很好,$就是地址计数器,汇编器在汇编程序时,汇编到一句,就把该句的偏移地址存放在地址计数器中;如果当前语句是指令,就把该指令的第一个字节的偏移地址放在其中;
.