![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 12:46 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 让你看看纯机器指令是怎么运行的,嘿嘿! |
| 可打印版本 1,467 / 14 |
| 第1楼 xy_god | 发表于 2003-10-30 00:00 |
| 中级用户 发帖 56 积分 276 | |
|
让你看看纯机器指令是怎么运行的,嘿嘿! ;***************************************************
;初学者进阶必读之汇编程序 ;作者:xy_god ;*********************堆栈段************************ STACK_SEG SEGMENT STACK STACK_SEG ENDS ;**********************数据段*********************** DATA_SEG SEGMENT PARA ABSCODE DB 00h,0Dh,0B4h,09h,00h,0Fh;机器指令代码 DB 0B0h,2Ah,00h,11h,0B7h,00h DB 00h,13h,0B3h,0DAh,00h,15h DB 0B9h,05h,00h,00h,18h,0CDh,10h DATA_SEG ENDS ;******************代码段*************************** CODE_SEG SEGMENT PARA MAIN PROC FAR ASSUME CS:CODE_SEG,DS ATA_SEGASSUME SS:STACK_SEG START: MOV AX,STACK_SEG MOV SS,AX MOV SP,0000h MOV AX,DATA_SEG MOV DS,AX ;---------------非常规代码------------------ MOV AX,SEG ABSCODE PUSH AX MOV AX,OFFSET ABSCODE PUSH AX RET ;----------------------------------------- MOV AX,4C00H INT 21H MAIN ENDP CODE_SEG ENDS ;******************程序结束************************ END START |
|
| 第2楼 xy_god | 发表于 2003-10-30 00:00 |
| 中级用户 发帖 56 积分 276 | |
|
说明一下,这个程序是我专门写给那些不知道机器代码是什么的人的!这个程序很简单,就是在数据段中写入相应的机器指令,然后在程序运行的时候跳入到这些机器指令当中去!
|
|
| 第3楼 xy_god | 发表于 2003-10-30 00:00 |
| 中级用户 发帖 56 积分 276 | |
|
对了,大家觉得我的程序的可读性怎么样啊?呵呵!多提宝贵意见啦!
|
|
| 第4楼 joeguan2 | 发表于 2004-05-15 00:00 |
| 初级用户 发帖 11 积分 146 | |
|
对于初学者,还应该对每一句进行注释
|
|
| 第5楼 crshen | 发表于 2004-05-16 00:00 |
| 中级用户 发帖 126 积分 447 | |
|
Call的寻址方式与jmp基本相同,但为了从子程序返回,该指令在跳转以前会把紧接着它的下一条指令的地址压进堆栈。如果是段内调用(目标地址是32位偏移量),则压入的也只是一个偏移量。如果是段间调用(目标地址是48位全地址),则也压入下一条指令的完全地址。同样,如果段间转移涉及优先级的变化,则有一系列复杂的保护检查。
与之对应retn/retf指令则从子程序返回。它从堆栈上取得返回地址(是call指令压进去的)并跳到该地址执行。retn取32位偏移量作段内返回,retf取48位全地址作段间返回。retn/f 还可以跟一个立即数作为操作数,该数实际上是从堆栈上传给子程序的参数的个数(以字计)返回后自动把堆栈指针esp加上指定的数*2,从而丢弃堆栈中的参数。这里具体的细节留待下一篇讲述。 虽然call和ret设计为一起工作,但它们之间没有必然的联系。就是说,如果你直接用push指令向堆栈中压入一个数,然后执行ret,他同样会把你压入的数作为返回地址,而跳到那里去执行。这种非正常的流程转移可以被用作反跟踪手段 |
|
| 第6楼 Michael | 发表于 2004-05-17 00:00 |
| 钻石会员 发帖 3,041 积分 10,056 | |
|
1010101011101010101010010101010111010101010110100101010101010101011110100101010101010101010101010101010101010101010101010101010000101010
这才叫机器指令,BD. |
|
| 第7楼 Backer | 发表于 2004-05-18 00:00 |
| 初级用户 发帖 3 积分 112 | |
|
楼主啊,这明明是汇编嘛,离机器指令还差两级跳咧。
不过在里面的数据段中还包含有机器指令,还算是符合帖意啦^_^ ret用的很巧妙 |
|
| 第8楼 Kinglion | 发表于 2004-05-21 00:00 |
| 铂金会员 发帖 1,924 积分 5,800 来自 金獅電腦軟體工作室 | |
|
同意第六层的意见.真正的机器码可是让人看了头痛不已的.
比如以下的十六进制代码: B4 30 CD 21 |
|
| 第9楼 aria | 发表于 2004-05-21 00:00 |
| 高级用户 发帖 243 积分 924 | |
|
为什么设了一个空的堆栈段?
难道不会出问题吗? |
|
| 第10楼 Backer | 发表于 2004-05-25 00:00 |
| 初级用户 发帖 3 积分 112 | |
|
5楼已经把这个程序分析得很清楚了,有以为楼主不知道什么是机器指令的朋友,请先看看5楼的回复再说。(留神看看数据段)
|
|
| 第11楼 六月飞雪 | 发表于 2004-05-25 00:00 |
| 高级用户 发帖 201 积分 893 | |
|
除了看不明白,其它的,都能明白
|
|
| 第12楼 ABO | 发表于 2004-05-25 00:00 |
| 初级用户 发帖 6 积分 122 | |
|
非常规代码的末句为何是RET,而不是RETF.
|
|
| 第13楼 CrazyWind | 发表于 2004-06-02 00:00 |
| 初级用户 发帖 12 积分 131 | |
|
某些人,这个的确是汇编。
不过,代码已经体现了:把机器代码放到数据段,然后跳到数据段执行指令。 那么你认为什么是机器指令,要不要把微指令也一起提一下~~ |
|
| 第14楼 boblhh9999 | 发表于 2004-06-03 00:00 |
| 中级用户 发帖 74 积分 316 | |
|
除了字母和数字都认识,其他的都不明白
|
|
| 第15楼 jihao1234567 | 发表于 2004-06-03 00:00 |
| 中级用户 发帖 58 积分 258 | |
|
这工具没准大家用的上………………
http://jihao1234567.go.nease.net/MNEMONIX.exe 请大家用工具软件下载,开单线程。 这个东西没准有些用处。 好像是解释机器语言代码的……………… |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |