汇编语言-救急!求大神这段C语言改写成汇编

问题描述

救急!求大神这段C语言改写成汇编 5C
#include
#include
#include
#include
#define PageUp 0x4900
#define PageDown 0x5100
#define Home 0x4700
#define End 0x4F00
#define Esc 0x011B

void char2hex(char xx char s[]) /* 把8位数转化成16进制格式 /
{
char t[] = ""0123456789ABCDEF"";
s[0] = t[(xx >> 4) & 0x0F]; /
高4位 /
s[1] = t[xx & 0x0F]; /
低4位 */
}

void long2hex(long offset char s[]) /* 把32位数转化成16进制格式 /
{
int i;
char xx;
for(i=0; i<4; i++)
{
offset = _lrotl(offset 8); /
循环左移8位 把高8位移到低8位 /
xx = offset & 0xFF; /
高24位置0 保留低8位 /
char2hex(xx &s[i*2]); /
把8位数转化成16进制格式 */
}
}

void show_this_row(int row long offset char buf[] int bytes_on_row)
{ /* 显示当前一行: 行号 偏移 数组首地址 当前行字节数 /
char far *vp = (char far *)0xB8000000;
char s[]=
00000000: xx xx xx xx|xx xx xx xx|xx xx xx xx|xx xx xx xx ................"";
/
| | |
| | |
00 10 59
上述3个数字是竖线对应位置元素的下标;
数组s的内容就是每行的输出格式:
其中左侧8个0表示当前偏移地址;
其中xx代表16进制格式的一个字节;
其中s[59]开始共16个点代表数组buf各个元素对应的ASCII字符。
/
char pattern[] =
00000000: | | | "";
int i;
strcpy(s pattern);
long2hex(offset s); /
把32位偏移地址转化成16进制格式填入s左侧8个'0'处 /
for(i=0; i<bytes_on_row; i++) /
把buf中各个字节转化成16进制格式填入s中的xx处 /
{
char2hex(buf[i] s+10+i*3);
}
for(i=0; i<bytes_on_row; i++) /
把buf中各个字节填入s右侧小数点处 /
{
s[59+i] = buf[i];
}
vp = vp + row*80*2; /
计算row行对应的视频地址 /
for(i=0; i<sizeof(s)-1; i++) /
输出s /
{
vp[i*2] = s[i];
if(i<59 && s[i] == '|') /
把竖线的前景色设为高亮度白色 /
vp[i*2+1] = 0x0F;
else /
其它字符的前景色设为白色 */
vp[i*2+1] = 0x07;
}
}

void clear_this_page(void) /* 清除屏幕0~15行 /
{
char far *vp = (char far *)0xB8000000;
int i j;
for(i=0; i<16; i++) /
汇编中可以使用rep stosw填入80*16个0020h */
{
for(j=0; j<80; j++)
{
*(vp+(i*80+j)*2) = ' ';
*(vp+(i*80+j)*2+1) = 0;
}
}
}

void show_this_page(char buf[] long offset int bytes_in_buf)
{ /* 显示当前页: 数组首地址 偏移 当前页字节数 /
int i rows bytes_on_row;
clear_this_page();
rows = (bytes_in_buf + 15) / 16; /
计算当前页的行数 /
for(i=0; i< rows; i++)
{
bytes_on_row = (i == rows-1) ? (bytes_in_buf - i*16) : 16; /
当前行的字节数 /
show_this_row(i offset+i*16 &buf[i*16] bytes_on_row); /
显示这一行 */
}
}

main()
{
char filename[100];
char buf[256];
int handle key bytes_in_buf;
long file_size offset n;
puts(""Please input filename:"");
gets(filename); /* 输入文件名; 汇编中可以调用int 21h的0Ah功能 /
handle = _open(filename 0); /
打开文件 返回句柄;
汇编对应调用:
mov ah 3Dh
mov al 0; 对应_open()的第2个参数 表示只读方式
mov dx offset filename
int 21h
mov handle ax
/
if(handle == -1)
{
puts(""Cannot open file!"");
exit(0); /
汇编对应调用:
mov ah 4Ch
mov al 0; 对应exit()中的参数
int 21h
/
}
file_size = lseek(handle 0 2); /
移动文件指针;
汇编对应调用:
mov ah 42h
mov al 2; 对应lseek()的第3个参数
; 表示以EOF为参照点进行移动
mov bx handle
mov cx 0; 对应lseek()的第2个参数
mov dx 0; /
int 21h
mov word ptr file_size[2] dx
mov word ptr file_size[0] ax
/
offset = 0;
do
{
n = file_size - offset;
if(n >= 256)
bytes_in_buf = 256;
else
bytes_in_buf = n;
lseek(handle offset 0); /
移动文件指针;
汇编对应调用:
mov ah 42h
mov al 0; 对应lseek()的第3个参数
; 表示以偏移0作为参照点进行移动
mov bx handle
mov cx word ptr offset[2]; cx:dx合一起构成
mov dx word ptr offset[0]; /32位值=offset
int 21h
/
_read(handle buf bytes_in_buf); /
读取文件中的bytes_in_buf个字节到buf中
汇编对应调用:
mov ah 3Fh
mov bx handle
mov cx bytes_in_buf
mov dx data
mov ds dx
mov dx offset buf
int 21h
/
show_this_page(buf offset bytes_in_buf);
key = bioskey(0); /
键盘输入;
汇编对应调用:
mov ah 0
int 16h
/
switch(key)
{
case PageUp:
offset = offset - 256;
if(offset < 0)
offset = 0;
break;
case PageDown:
if(offset + 256 < file_size)
offset = offset + 256;
break;
case Home:
offset = 0;
break;
case End:
offset = file_size - file_size % 256;
if(offset == file_size)
offset = file_size - 256;
break;
}
} while(key != Esc);
_close(handle); /
关闭文件;
汇编对应调用:
mov ah 3Eh
mov bx handle
int 21h
*/
}

解决方案

编译后反编译就是汇编了

解决方案二:
同上,你这个代码也太多了,你反汇编后再试着修改一下应该问题就可以了!

时间: 2024-08-31 10:57:51

汇编语言-救急!求大神这段C语言改写成汇编的相关文章

求大神给段shopnc wap端整合微信登录的完整代码,小弟在此感谢

问题描述 求大神给段shopnc wap端整合微信登录的完整代码,小弟在此感谢 新人小白,最近在学习微信开发和shopnc开发,求大神们给段shopnc wap端微信登录的代码,在此先拜谢了 解决方案 没有代码自己上网找现在微信火,网上有很多

typeof-js验证注册表单信息,怎么写,求大神给段代码。

问题描述 js验证注册表单信息,怎么写,求大神给段代码. function checkIdNumber(){ var patientCard=$("#patientCard").val(); if(typeof(patientCard)=='undefined'||patientCard==""){ msg("该项为必填项!"); return false; } var idNumber=/^(^[1-9]d{7}((0d)|(1[0-2]))(

c语言-求大神设计一个C语言的连连看!!谢谢!!

问题描述 求大神设计一个C语言的连连看!!谢谢!! 1 问题描述 连连看是一个经典的游戏,本课题要求实现一个文本界面的连连看游戏. 2 基本要求 要能提供以下几个基本功能: (1)定义一个矩阵,随机产生字符布置地图,例如下面这个4x4 的地图. 1 2 3 4 B C H C 1 C F B E 2 A E D F 3 C H A D 4 (2)游戏者通过坐标(1,2).(3,4)判定第一行第二列的字符与第三行第四列的字符是相同的),判定争取则相应位置的字符消失,如判断错误给出相应的错误提示,允

linq的相关技术生成-求大神,帮忙把SQL转成LINQ,小弟第一次涉及LINQ需要参考谢谢了

问题描述 求大神,帮忙把SQL转成LINQ,小弟第一次涉及LINQ需要参考谢谢了 select * from ( select a.codea.gid from productonsale a productinformation b GeneralStandardCategory c where a.prodid=b.gid and b.StdCatID =c.gid and c.code in ('607''609') and a.ChlID='0DB3B832-3E16-E111-A1F0

求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃

问题描述 求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃 #include #include #include typedef struct TNode { char date; struct TNode *lchild,*rchild; }TNode,*BiTree; typedef struct { BiTree top; BiTree *base; int stacksize; }Stack; int createBiTree(BiTree &S){ char ch

c语言编程-求大神帮解C语言编程问题求解

问题描述 求大神帮解C语言编程问题求解 有一个游戏关卡,由一个老怪Q把守,它的攻击能力为a,血量为b,每一个回合可以回血c.游戏角色P,具有攻击能力d,血量e,每一回合回血f.请问P能否击败老怪Q,如果不能,需要几个P协作击败老怪Q? 解决方案 假设两者的血量e.b开始的血量,在打斗的过程中攻击力和回血均不会变化,那么只比较两者的血量就可以了如下: public static String fight(int a,int b, int c,int d, int e,int f) { int li

求大神解释下c语言双重for循环的汇编语句??

问题描述 求大神解释下c语言双重for循环的汇编语句?? void main(){ int i,j; for(i=0;i<5;i++){ printf("0"); for(j=0;j<2;j++){ printf("1"); } } } 汇编: main: .LFB24: pushl %ebp movl %esp, %ebp pushl %ebx andl $-16, %esp subl $16, %esp movl $5, %ebx .L3: movl

小女子跪求大神帮忙~关于json字符串转换成实体类。。

问题描述 求实例比如说我现在的json字符串是[{"name":"aa","passwd":"bb"},{"name":"aa2","passwd":"bb2"},...],我需要把它转存到javaBean中,但是我在并不知道接受的JSON字符串的内容中name和passwd的先后位置(因为我做的是socket传输json格式的数据,并且其中的数据

代码-android中发送验证码,才开始学的,求大神解答。

问题描述 android中发送验证码,才开始学的,求大神解答. 这个现在还没有数据库,只是我学习用的,点发送验证码,后面会提示多少秒后重新获取验证码,求大神给段代码. 解决方案 MyCoun myCoun = new MyCoun(60000 1000); /** * 倒计时定时器 * * @author 1 * */ public class MyCoun extends CountDownTimer { public MyCoun(long millisInFuture long count