怎么调试包含有80386以上指令的汇编程序?

tyingzi 2003-10-15 10:29:54
用TD或DEBUG怎么总是反汇编后不对?
...全文
82 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
giantzz 2003-10-25
  • 打赏
  • 举报
回复
多简单的问题,搞的这么乱
aabiao 2003-10-24
  • 打赏
  • 举报
回复
我的观点:
的确划分标准难说,没意思。但DOS中完全可以用32位。
能否可以用32位寄存器与CPU设置有关,默认是.8086,还有.386/.386p有P的是保护模式

TD(就是DOS的不是TD32)完全可以调试32位的,我一直如此。怎么楼上的都说td不行?
汇编用MASM5即可,结构:
.model small
.386 这句必须在.model后,否则反汇编不对,哪位知道请告知。是BUG?
.data

.code
mov ax,1234h
mov eax,12345678h
push 1234h
shl ax,4
mov ah,4ch
int 21h
SoRoMan 2003-10-23
  • 打赏
  • 举报
回复
to:SnHnBn(大可达)

不爭了,在劃分多少位程序上,你那種有你的道理。我保留我的看法(起碼有系統靠image格式判別多少位的程序,雖然不完全科學。)不同的角度而已。

to:樓主
嫌那些TRW2000,SOFTICE,OLLYDBG之類煩人,用debug32或phdebug。去google一個吧。
junhli 2003-10-22
  • 打赏
  • 举报
回复
人家作了防debug的处理,反汇编不出来很正常,这根16位32位没什么关系。
SnHnBn 2003-10-22
  • 打赏
  • 举报
回复
很显然一个包含有32bit指令的程序,是不能在16bit CPU上运行的。因此,你所举的两个例子,我认为是32bit的程序。当然另一种32bit程序说法是看Image格式,但是我认为这不是严格的定义。Image格式是多少bit的,其实基本上仅仅取决于寻址的位数,因此就又产生了一种误解“起碼如果沒有涉及32位尋址(flat memory)。我們可以認為是16位。
”。寻址能力只是运算器和寄存器位数的一个表现方面而已。如果一个Image是自己定义自己装载的话,应该怎样算?
SnHnBn 2003-10-22
  • 打赏
  • 举报
回复
指令的划分其实很明显,我前面已经说过“一是寄存器的位数,二是运算器的运算位数。”因为这两项指标直接表明执行该指令的CPU具有的运算位数,区分32bit或是16bit CPU正是如此。如果一个CPU(x86)能够执行add eax,edx 这样的指令,你说不能明确表明它是一个32bitCPU吗?指令的划分其实很自然,哪里来的生硬?
如果连划分都没有,你们在谈论16bit,32bit的时候,其实不都在说废话?
SoRoMan 2003-10-22
  • 打赏
  • 举报
回复
赫赫,我們其實知道的太少。也許根本就沒有必要劃分16/32bit程序,甚至是指令。就像mov ah,0之類,是8位指令?嚴格意義上,都是有序的bit運算的集合,非要生硬的劃分沒有什麼意義。沒什麼意義。。。
SoRoMan 2003-10-22
  • 打赏
  • 举报
回复
程序是指令的集合。
由於兼容,就存在16/32bit指令混用的情況,看看下面兩個匯編代碼:
.386
code segment
assume cs:code
start:
mov eax,0
mov ax,0
code ends
end start

.386
code segment use32
assume cs:code
start:
mov eax,0
mov ax,0

code ends
end start

如果非要劃分上面程序是16還是32bit程序,樓上恐怕會說是32bit程序。這樣的劃分有確定的依據嗎?看看機器碼。我說1為16位程序。

Lymtics 2003-10-22
  • 打赏
  • 举报
回复
呵呵,解壳在前,16/32在后....
大哥们别学Hydradisk 喷口水啊~~~~
到底用什么工具最好(如何理解看各位大哥)?
我想知道...........
SoRoMan 2003-10-21
  • 打赏
  • 举报
回复
我上面已经说过CPU工作模式和16/32位汇编没有必然联系.实模式下可以用16/32bit解码,保护模式也可以用16/32位解码.

"看来楼上只用过X86指令集,所以想当然的自己划分16bit和32bit。"??

对于那些不兼容16位架构的CPU,哪里谈的上16/32位?只要那些为了兼容16位指令,不管X86也好,alpha axp也好,在划分16bit和32bit应该是同样的道理.



SnHnBn 2003-10-21
  • 打赏
  • 举报
回复
“在划分16bit和32bit应该是同样的道理”
说了半天,你还是没有说出你的道理。
Areslee 2003-10-20
  • 打赏
  • 举报
回复
不是这样吧,照楼主的问法,LGDT/SGDT
之类的指令算是32位指令吗?但它们就是386以上的指令。
SnHnBn 2003-10-20
  • 打赏
  • 举报
回复
说到指令前缀,我大概明白了你们的划分方法。
在32bit保护模式下,指令默认解码为32bit操作。若做16bit操作需要加16bit前缀。
在16bit保护模式和实模式下,指令默认解码为16bit操作。若做32bit操作需要加32bit前缀。

因为这个默认解码方式,所以32bit保护模式被认为是32bit模式,而实模式被认为是16bit模式。到这里都没有什么问题,问题就是在32bit模式下运行指令才能算32bit汇编?在实模式运行指令就算16bit汇编?这个好像确实不太恰当,再往后推就成了做实模式下做32bit运算的指令也成了16bit汇编,这个概念明显是错误的。
SnHnBn 2003-10-20
  • 打赏
  • 举报
回复
哪你们又是如何区分32bit汇编和16bit汇编的呢?真奇怪啊……
不会是根据PE NE MZ等程序映象格式吧?汇编指令的位数似乎和Image没有必然联系啊?

至于楼主的问法,我只是猜想是TD不能识别32位汇编指令格式而已。猜想而已,我也没有验证。后来才发现,TD也能够识别32bit指令,楼主的问法确实有点怪,大概他用的版本太老,不能识别32bit指令前缀(实模式下做32bit操作需要)。

而关于TD32只能够识别PE和DPMI的程序Image,这一点是我搞错了,很久没用,忘记了。DOS的时候我用它跟过DPMI的游戏,事实上Load的时候已经自动切换到保护模式了。
SnHnBn 2003-10-20
  • 打赏
  • 举报
回复
看来楼上只用过X86指令集,所以想当然的自己划分16bit和32bit。
SoRoMan 2003-10-20
  • 打赏
  • 举报
回复
TO: SnHnBn(大可达)
你也許是按照像多少位的計算機那樣劃分多少位程序。涉及到32位的寄存器或操作數就應算是32位程序了,就像在8086年代,不會出現32位程序,或是eax。這只是一種劃分方法而已。實際上有些地方不是這樣劃分的,並沒有嚴格定義。我所說的16位匯編編譯器有很多,像masm和tasm早期版本,如tasm4.1裡的幫助文件注有for 16bit的,BL要說它是16bit的,你說它的劃分依據是什麼?它照樣編譯 xor eax,eax.

至於16位跟實模式就更是沒必然聯系了。在實模式下可以輕易處理32位的寄存器,訪問32位地址。

INTEL一味的兼容,造成了很多問題的“兼容”...




SnHnBn 2003-10-18
  • 打赏
  • 举报
回复
如果你们觉得我说的不对,你们给出一个严格的判断标准吧,看看合不合理。
SnHnBn 2003-10-18
  • 打赏
  • 举报
回复
多少位其实有一个很明确的概念,为什么这里这么混乱呢?
一是寄存器的位数,二是运算器的运算位数。
这里(星星和斑竹做代表)看来是喜欢把CPU模式和指令位数乱搞一通了。
事实上,你们所说的16bit准确的说法是实模式(或者是V86模式)。其实,搂主说的是在实模式下反汇编32bit指令。
但是32bit指令不能被TD识别(因为都有一个32bit前缀),但是可以用TD32,这也是一个能够在实模式下运行的程序,同时也能运行在保护模式。

哎,这里的人很多都是初学者,被你们几个星星和斑竹混淆了概念可是一件糟糕的事情。
W32API 2003-10-18
  • 打赏
  • 举报
回复
INTEL 指令集并没有对这些做严格的限制,所以不能仅凭寄存器位宽来做鉴别。
SnHnBn 2003-10-18
  • 打赏
  • 举报
回复
楼上,当然可以。32bit程序又不是不能用16bit指令。
加载更多回复(15)

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧