博文

今天郁闷了(2007-06-12 22:30:00)

摘要:今天遇到了一个问题,一直没解决啊,很简单,就是 ret 和 mov ax,4c00h int 21h 的区别啊,我问了很多人,他们都说是一样的只不过前者返回过程,后者是直接返回 dos 但我在做一个题时遇到问题觉得他们说的都不准确啊,请看: DATA SEGMENT
MESG1 db 0DH,0AH,'FOUND$'
MESG2 Db 0DH,0AH,'NO FOUND$'
MESG3 Db 'ENTER KEYWORD:$'
BUFFER  DW  3213,5128,57826,7632,1387
        DW  45321,928,9876,1899,45678
COUNT dw 10
ADDR  DW   0
DATA ENDS
CODE SEGMENT
  ASSUME  CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MESG3
INT 21H
CALL  DECIBIN
MOV  AX,BX
MOV   DI,OFFSET BUFFER
MOV  CX,COUNT
NEXT:     CMP AX,[DI]
          JE  OK
          ADD  DI,2
          LOOP  NEXT
          MOV ADDR,-1
 ......

阅读全文(2770) | 评论:4

堆栈的使用心的(2007-06-11 11:35:00)

摘要:请看下面的lea sp,tos这句为什么用-t指令不显示啊,但是执行执行了 stack_seg  segment    dw 100 dup(?)    tos label word stack_seg ends code segment main proc far assume cs:code,ss:stack_seg start: mov ax,stack_seg mov ss,ax lea sp,tos //就是这句为什么不显示 ret
main endp code ends end start 在查了有关资料得出:这个是 cpu 的个保护功能的体现吧. 堆栈是由 SS 和 SP 共同指定的, 要设置完整的堆栈地址, 需要有两条指令, 如果在这两条指令间发生中断, 那么就可能导致堆栈的错误使用, 引发的后果难以预料. 因此, 一般在设置堆栈前, 早期的做法就是采用 cli 指令禁止可屏蔽类中断, 设置完成后再 sti; 后来的 cpu 籍此增加了个保险措施, 就是遇见设置堆栈的指令组时, 让它们一并执行, 中间不允许中断, 行如一条指令, 这样也是为了防止无意中漏了 cli 指令导致不良后果
哈哈哈,学习了,我也验证了,凡是跟在 mov ax,stack_seg mov ss,ax 后的语句都不显示,和mov ss,ax一起连续执行......

阅读全文(2688) | 评论:0

debug详解(2007-06-10 09:27:00)

摘要:DEBUG是DOS中的一个外部命令,从DOS 1.0起就带有此命令,因此可见此命令的重要性了。虽然此命令的功能非常强大,可以解决许多问题,可是对许多人来说,尤其是初学者来说,却非常不易掌握。因此,现将DEBUG的命令详细介绍一番,以让大家知道它的使用。 Debug:A(汇编)
直接将 8086/8087/8088 记忆码合并到内存。 该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。
a [address]
参数 address 指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。 有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。 有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。
说明 使用记忆码 段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。
汇编跳转和调用 汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示: -a0100:0500
0100:0500 jmp 502 ; a 2-byte short jump
0100:0502 jmp near 505 ; a 3-byte near jump
0100:0505 jmp far 50a ; a 5-byte far jump 可以将 near 前缀缩写为 ne。
区分字和字节内存位置 当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式: dec wo [si]
neg byte ptr [128]
指定操作数 Debug 使用包括在中括号 ([ ]) 的操作......

阅读全文(2469) | 评论:1