
关于一个汇编程序显示字符串"HELLO"的问题
汇编源代码:ASSUMECS:CODE;定义代码段CODESEGMENT;代码段声明DB'HELLO','$';定义字符串"HELLO$"NOP;空操作指令PUSHCS;...
汇编源代码:
ASSUME CS:CODE ;定义代码段
CODE SEGMENT ;代码段声明
DB 'HELLO','$' ;定义字符串"HELLO$"
NOP ;空操作指令
PUSH CS ;入栈
POP DS ;出栈
MOV DX,00H ;DX置为零
MOV AH,09H ;置功能号09H
INT 21H ;调用DOS中断
MOV AH,00H ;置功能号00H
INT 16H ;调用BIOS中断
MOV AH,4CH ;置功能号4CH
INT 21H ;调用DOS中断
CODE ENDS ;代码段结束
END ;汇编结束
问:
为什么我在定义字符串后,不添加NOP指令它就跳到其它地方去了。(我不写START标号,是因为我想看看是不是没有START标号,它就不能正确执行了……)
使用MASM5.0编译,可以正常执行,我想弄明白,为什么一定要添加NOP指令。
还有,在程序开始用MOV指令传送CS的值到AX,然后再转到DS,竟然少了10H,将指令换到其它位置,就没用了!这又是为什么??? 展开
ASSUME CS:CODE ;定义代码段
CODE SEGMENT ;代码段声明
DB 'HELLO','$' ;定义字符串"HELLO$"
NOP ;空操作指令
PUSH CS ;入栈
POP DS ;出栈
MOV DX,00H ;DX置为零
MOV AH,09H ;置功能号09H
INT 21H ;调用DOS中断
MOV AH,00H ;置功能号00H
INT 16H ;调用BIOS中断
MOV AH,4CH ;置功能号4CH
INT 21H ;调用DOS中断
CODE ENDS ;代码段结束
END ;汇编结束
问:
为什么我在定义字符串后,不添加NOP指令它就跳到其它地方去了。(我不写START标号,是因为我想看看是不是没有START标号,它就不能正确执行了……)
使用MASM5.0编译,可以正常执行,我想弄明白,为什么一定要添加NOP指令。
还有,在程序开始用MOV指令传送CS的值到AX,然后再转到DS,竟然少了10H,将指令换到其它位置,就没用了!这又是为什么??? 展开
展开全部
请查看、对比反汇编码!
追问
就是用DEBUG调试后才得出的正确代码。
问题是我不明白,调试时,看到的DB之后的指令,竟然不是我写的指令,而是其它看不懂的指令,然后要么是显示一堆乱码,要么是直接就跳到了程序末,在我加了NOP指令后,程序才得以正确执行。
追答
你可以先了解下“代码混淆”,“花指令”等概念。
END指令没有标号参数,一般是定义模块。
不过,也不要急于求成,欲速则不达。先规矩地写代码吧!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询