qq_41744151 2019-06-20 16:16 采纳率: 0%
浏览 776

C语言代码改写成汇编语言代码

把下面的代码改写成汇编语言代码
#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) /
汇编中可以通过检查CF==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
*/

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 15:29
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。