Would you tell me how to do ? [SOS] C++ ->ASM

hjandy 2000-11-07 02:09:00
我想将下面程式中的init_port和send_port改成汇编。但我不识汇编,你能帮个忙吗?因我在Delphi 5.x开发了一个系统,在Delphi 5.x可使用ASM。

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>

void init_port(code)
unsigned char code;
{
union REGS r;

r.x.dx = 0; /* com1 */
r.h.ah = 0;
r.h.al = code;
int86(0x14,&r,&r);
}

void send_port(c)
char c;
{
union REGS r;

r.x.dx = 0; /* com1 */
r.h.al = c;
r.h.ah = 1;
int86(0x14,&r,&r);
if (r.h.ah & 128) {
printf("send error !\n");
exit(-1);
}
}

/************************/
void setmode(mode)
int mode;
{
send_port(27);
if (mode==1) send_port(17); /* mode 1: overwrite mode */
if (mode==2) send_port(18); /* mode 2: overwrite mode */
if (mode==3) send_port(19); /* mode 3: overwrite mode */
}

void cleardisplay()
{
send_port(12);
}

void initdisplay()
{
send_port(27);
send_port(64);
}

void writestring(cc)
char *cc;
{
int i,len;

len=strlen(cc);

send_port(27);
send_port(81);
send_port(65);
for (i=0;i<=len;i++) {
send_port(toascii(cc[i]));
}
send_port(13);
}

void setstatus(s1,s2,s3,s4,s5)
int s1,s2,s3,s4,s5;
{
send_port(27);
send_port(81);
send_port(67);
send_port(s1+0x30);
send_port(s2+0x30);
send_port(s3+0x30);
send_port(s4+0x30);
send_port(s5+0x30);

send_port(13);
}

void setpoint(k,n)
int k,n; /* n=1 On, n=0 Off 1=<k<=11 */
{
send_port(27);
send_port(46);
send_port(k);
send_port(n);
}

void statusonly(k,n)
int k,n; /* n=1 On, n=0 Off 1=<k<=5 */
{
send_port(27);
send_port(115);
send_port(k);
send_port(n);
}

void setcursor(n)
int n; /* n=1 On, n=0 Off */
{
send_port(27);
send_port(95);
send_port(n);
}

void cursormlr(kk)
int kk;
{
send_port(27);
send_port(91);
if (kk==1) send_port(67); /* kk=1 right move, kk=-1 left move */
if (kk==-1) send_port(68);
}

void cursormud(kk)
int kk;
{
send_port(27);
send_port(91);
if (kk==1) send_port(65); /* kk=1 up move, kk=-1 down move */
if (kk==-1) send_port(66);
}

void leftmost()
{
send_port(27);
send_port(91);
send_port(76);
}

void rightmost()
{
send_port(27);
send_port(91);
send_port(82);
}

void cursorhome()
{
send_port(27);
send_port(91);
send_port(72);
}

void cursorbottom()
{
send_port(27);
send_port(91);
send_port(75);
}

void cursormove(x,y)
int x,y; /* 1<=x<=11, y=1 */
{
send_port(27);
send_port(108);
send_port(x);
send_port(y);
}

/*****************************/
void main()
{
void aaaa();
int i;
init_port(251);
/*255 ff 251 f */
printf(" clear screen! press any key\n");
getch();
cleardisplay();
cursorhome();
printf("display '1.23456789013',press any key\n");
getch();
writestring("1.23456789013");
printf("display 'ABCDEFGHIJKLN',press any key\n");
getch();
writestring("ABCDEFGHIJKLN"); /* string */
printf("display 'QPQRSTUVWXYZ.+',press any key\n");
getch();
writestring("OPQRSTUVWXYZ.+"); /* string */
printf("display '-=QRSTUVWXYZ.+',press any key\n");
getch();
writestring("-=QRSTUVWZXYZ.+"); /* string */
aaaa();
}

void aaaa()
{
int i;
printf("cursor to home,press any key\n");
getch();
cursorhome();
printf("clear screen!,press any key\n");
getch();
cleardisplay();
printf("display 5 kinds of status LED,press any key\n");
getch();
setstatus(1,0,0,0,0); /* status */
delay(500);
setstatus(0,1,0,0,0);
delay(500);
setstatus(0,0,1,0,0);
delay(500);
setstatus(0,0,0,1,0);
delay(500);
setstatus(0,0,0,0,1);
delay(500);
printf("clear sreen and set cursor to position 1\n");
getch();
cleardisplay();
setcursor(1);
printf("display point! press any key\n");
getch();
for (i=1;i<13;i++) {
setpoint(i,1);
delay(1500);
setpoint(i,0);
}
for (i=12;i>0;i--) {
setpoint(i,1);
delay(1500);
setpoint(i,0);
}
printf("clear screen and display '888888888888' !\n");
printf("cursor to home and 5 kinds of status LED on, press any key\n");
getch();
cleardisplay();
cursorhome();
writestring("888888888888\n");
setstatus(1,1,1,1,1);
printf("move cursor,press any key\n");
getch();

for (i=1;i<13;i++)
{
cursorhome();
setcursor(i);
delay(1500);
cleardisplay();
}
printf("press any to exit!");
getch();
}
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjandy 2000-11-14
  • 打赏
  • 举报
回复
因我不识汇编,你能帮个忙吗?详细举个例子吗?
此系收费顾客显示屏的主要部份用于通过显示屏
显示收费,找零之类.


hjandy 2000-11-12
  • 打赏
  • 举报
回复
你好,我想将下面C++程式中的init_port和send_port改成汇编。

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>

void init_port(code)
unsigned char code;
{
union REGS r;

r.x.dx = 0; /* com1 */
r.h.ah = 0;
r.h.al = code;
int86(0x14,&r,&r);
}

void send_port(c)
char c;
{
union REGS r;

r.x.dx = 0; /* com1 */
r.h.al = c;
r.h.ah = 1;
int86(0x14,&r,&r);
if (r.h.ah & 128) {
printf("send error !\n");
exit(-1);
}
}

wangshen 2000-11-12
  • 打赏
  • 举报
回复
可惜制表附没有对齐,将就着看吧,注意别用到NT下去。
wangshen 2000-11-12
  • 打赏
  • 举报
回复
下面这个玩意儿应该可以看懂了吧。


unit Port95;

interface

function PortReadByte(Addr:Word) : Byte;
function PortReadWord(Addr:Word) : Word;
function PortReadWordLS(Addr:Word) : Word;
procedure PortWriteByte(Addr:Word; Value:Byte);
procedure PortWriteWord(Addr:Word; Value:Word);
procedure PortWriteWordLS(Addr:Word; Value:Word);

implementation

{**************************************************************
* Port Read byte function *
* Parameter: port address *
* Return: byte value from given port *
**************************************************************}
function PortReadByte(Addr:Word) : Byte; assembler; register;
asm
MOV DX,AX
IN AL,DX
end;
{**************************************************************
* HIGH SPEED Port Read Word function *
* Parameter: port address *
* Return: word value from given port *
* Comment: may problem with some cards and computers *
* that can't to access whole word, usually it work. *
**************************************************************}
function PortReadWord(Addr:Word) : Word; assembler; register;
asm
MOV DX,AX
IN AX,DX
end;
{**************************************************************
* LOW SPEED Port Read Word function *
* Parameter: port address *
* Return: word value from given port *
* Comment: work in all cases, only to adjust DELAY if need *
***************************************************************}
function PortReadWordLS(Addr:Word) : Word; assembler; register;
const
Delay = 150; // depending of CPU speed and cards speed
asm
MOV DX,AX
IN AL,DX // read LSB port
MOV ECX,Delay
@1:
LOOP @1 // delay between two reads
XCHG AH,AL
INC DX // port+1
IN AL,DX // read MSB port
XCHG AH,AL // restore bytes order
end;
{**************************************************************
* Port Write byte function *
* Parameter: port address *
**************************************************************}
procedure PortWriteByte(Addr:Word; Value:Byte); assembler; register;
asm
XCHG AX,DX
OUT DX,AL
end;
{**************************************************************
* HIGH SPEED Port Write word procedure *
* Comment: may problem with some cards and computers *
* that can't to access whole word, usually it work. *
**************************************************************}
procedure PortWriteWord(Addr:word; Value:word); assembler; register;
asm
XCHG AX,DX
OUT DX,AX
end;
{**************************************************************
* LOW SPEED Port Write Word procedure *
* Parameter: port address *
* Return: word value from given port *
* Comment: work in all cases, only to adjust DELAY if need *
**************************************************************}
procedure PortWriteWordLS(Addr:word; Value:word); assembler; register;
const
Delay = 150; // depending of CPU speed and cards speed
asm
XCHG AX,DX
OUT DX,AL // port LSB
MOV ECX,Delay
@1:
LOOP @1 // delay between two writes
XCHG AH,AL
INC DX // port+1
OUT DX,AL // port MSB
end;

end.

dwbclz 2000-11-08
  • 打赏
  • 举报
回复
你的想法是行不通的.
保护模式下的程序和dos程序是不一样的,dos程序有着操作系统级的权限,
而windows程序却并不是可以执行所有的汇编指令.

你应该先说一下你想要完成那些功能,项达到什么目的,我们也许可以用一些其它的方法.

欢迎来我的主页看看:
http://dwbclz.myetang.com
这里讲述了最新的汇编优化理论,
和时下流行的一些指令集:SSE,3DNow
xiaozuo 2000-11-07
  • 打赏
  • 举报
回复
我会汇编,但是看不懂你的Delphi,当然就无法明白你所需要的功能。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧