当前位置: 代码迷 >> 汇编语言 >> 奇怪ds造端,小汇编程序
  详细解决方案

奇怪ds造端,小汇编程序

热度:163   发布时间:2016-05-02 04:30:40.0
奇怪ds开头,小汇编程序
assume cs:code,ds:data
data segment
db 8,11,8,1,8,5,63,38
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0
mov bx,0
mov cx,8
s: cmp byte ptr [bx],8
je ok
jmp short next
ok: inc ax
next: inc bx
loop s
mov ax,4c00h
int 21h

code ends
end start

为何08 0B变成38 01,求解释
------解决思路----------------------
你上面设置的 ss:sp=0ffff:0000 不是个程序可以随意写入的地方,那里是 bios 的区间。
这个和前面个程序一样地是由堆栈设置不当造成的,但在最上面却看不到你源程序里有设置堆栈的,不知道你是故意隐匿了这部分,还是你所用的汇编链接程序有问题。
总拿些这方面的问题来,恐怕是很……
------解决思路----------------------
纯DOS下的Turbo Debug:
BreakPoints、Changed memory global...、
BreakPoints、Hardware breakpoints...、
http://download.csdn.net/source/2805028




Win32下的VC6:
To break when the value at a specified memory address changes 

From the Edit menu, click Breakpoints.


Click the Data tab of the Breakpoints dialog box.


In the Expression text box, type the memory address for the byte. 
For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.)

In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords. 


Click OK to set the breakpoint. 

------解决思路----------------------
start: mov dx,0ffffh 你怎么这么有才。。。寻址只有20bit 实地址模式
 
这里 你敢保证 数据段的8 是 DS:0?
我仿佛记得有对齐的 而且MASM默认对其.. 应该用OFFSET安全些 最好你看下是否偏移是0
mov bx,0
mov cx,8
s: cmp byte ptr [bx],8

你敢保证 DOSbox安全?

你应该在DOS下 
mov ax,data
mov ds,ax
然后个数据 ”8 ” 的读取 ds第一地方 如果还是 38h 那么截图再来看看

照上边的样子 stack没有用到 而且中断也没有调用
是在说mov ds , ax 指令还会潜在的写堆栈? 那么要么你的编译器是一个骗子
要么你的CPU不合群