程序如下:
assume cs:code,es:data
data segment
a dw 1,2,3,4,5,6,7,8
b dd 0
data ends
code segment
start: mov ax,data
mov es,ax
mov si,0
mov cx,8
s: mov ax,a[si]
add word ptr b,ax
adc word ptr b[2],0
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
a[si],默认寻址的寄存器是ds,那么段地址应当到ds中去找。但是assume又把es和data段对应起来,那么应当把data的值送到es中。这样一来就产生了矛盾。
编译成exe文件,在debug中试验了一下,发现反汇编之后,mov ax,a[si]被写成了
140E:000B 36 ES:
140E:000C 8B840000 MOV AX,[SI+0000]
再次修改程序:assume cs:code,ss:data
编译连接之后在debug中看到
140E:000B 36 SS:
140E:000C 8B840000 MOV AX,[SI+0000]
从网上搜来的:
assume是指明变量与段寄存器的联系,比如assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址。
原来是这样的:数据标号a是在data段中的,a[si]寻址时,段地址就在与data段联系的段寄存器中。而不是像之前想当然认为的,a[si]的寻址,就是隐含寻址ds。
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50