| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2301 人关注过本帖
标题:[求助]TASM不支持SIZEOF伪指令,如何求字符串长度
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:8 
[求助]TASM不支持SIZEOF伪指令,如何求字符串长度

刚学了两天的汇编非常的菜,做了个两个等长字符串的比较程序,用C语言混编的,由于TASM不支持SIZEOF伪指令,我不知道如何获得用户输入字符串的长度,想做一个变长的字符串的比较程序,请各位高手指点,谢谢啦。

下面贴上源代码:
; t1.asm
PUBLIC _strcmp

.model small
.186
.code
_strcmp PROC C s1:BYTE, s2:BYTE, c:WORD
push bx ; save registers
push si
push di
mov si,OFFSET s1 ; address to s1
mov di,OFFSET s2 ; address to s2
mov cx,c ; set counter to c
L:
mov ah, [si] ; indirect access
mov bh, [di]
cmp ah,bh ; compare two character
jne RES1 ; if not equal
inc si ; move pointer by 1
inc di
loop L ; loop the label
mov ax,1 ; two strings are completely equal
pop di ; restore registers
pop si
pop bx
ret
RES1:
mov ax,0 ; no equal
pop di ; restore registers
pop si
pop bx
ret
_strcmp ENDP
END

/* test1.cpp */
#include <stdio.h>

extern "C" int strcmp(char *s1, char *s2, int size);

int main() {
char *s1 = "Hello", *s2 = "Hello";
printf("%s\n",strcmp(s1,s2,5) ? "Equal" : "Not Equal");
return 0;
}

编译方法:
打开BC或者TC的IDE,创建一个PROJECT,将这两个文件添加进去,然后RUN就可以了。

搜索更多相关主题的帖子: SIZEOF TASM 指令 字符 源代码 
2006-06-30 16:21
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

虽然没有人回复,但还是要谢谢大家的关注。
问题已经解决了,我重新写了个strcmp过程

贴上源代码
; func.asm
PUBLIC _strlen
PUBLIC _strcmp

.model small
.186
.code
_strlen PROC C s: PTR BYTE
cmp s, BYTE PTR 0
jz QUIT0
push si
mov si, OFFSET s
mov ax, 0
L: cmp [si], BYTE PTR 0
jz QUIT1
inc si
inc ax
jmp L
QUIT0:
mov ax,0
ret
QUIT1:
pop si
ret
_strlen ENDP

_strcmp PROC C s1: PTR BYTE, s2: PTR BYTE
push si
push di
push s1
call _strlen
mov bx, ax
push s2
call _strlen
cmp bx, ax
jg C1
jl C2
je C3
C1:mov cx, ax
C2:mov cx, bx
C3:mov cx, ax
mov si, OFFSET s1
mov di, OFFSET s2
L1:mov ah, [si]
mov al, [di]
cmp ah, al
jg GREATER
jl LESS
inc si
inc di
loop L1
jmp EQUAL
GREATER: mov ax,2 ; s1 > s2
pop di
pop si
ret
EQUAL : mov ax,0 ; s1 = s2
pop di
pop si
ret
LESS : mov ax,1 ; s1 < s2
pop di
pop si
ret
_strcmp ENDP
END

/* main.cpp */
#include <stdio.h>

#ifdef __cplusplus
#define EXT extern "C"
#else
#define EXT extern
#endif

EXT int strcmp(char *s1,char *s2);

char *tbl[] = {"Equal to","Less than", "Greater than"};

int main() {
char *s1 = "Hello", *s2 = "Hello";
printf("%s\n",tbl[strcmp(s1,s2)]);
return 0;
}

[此贴子已经被作者于2006-7-1 9:10:01编辑过]


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-07-01 08:58
‰唯我
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-12-2
收藏
得分:0 
[求助]编译原理问题

请教大家:
1. 汇编语言是怎么诞生的那?有人说是汇编写的DOS.

那汇编又是在哪种操作环境下写的DOS那?

2.现在的TC2.0编译器至少也要运行在DOS系统下,那么C的函数库

和操作系统又有什么关系那?

我是学生,书上只是概括讲了一下,说C编译原理是编辑,连接,执行,此话没有头绪.


每天笑呵呵!~~
2006-12-04 10:27
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
好象可以用LENGTH

2006-12-04 12:38
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用‰唯我在2006-12-4 10:27:54的发言:

请教大家:
1. 汇编语言是怎么诞生的那?有人说是汇编写的DOS.

那汇编又是在哪种操作环境下写的DOS那?

2.现在的TC2.0编译器至少也要运行在DOS系统下,那么C的函数库

和操作系统又有什么关系那?

我是学生,书上只是概括讲了一下,说C编译原理是编辑,连接,执行,此话没有头绪.

了解这个有什么用?难道考试会考这个?


2006-12-04 12:41
‰唯我
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-12-2
收藏
得分:0 

我没找到发新帖子的地方,在什么位置啊?

这个有用!


每天笑呵呵!~~
2006-12-04 12:45
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
左上角“发表文章”

2006-12-04 12:46
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
你问的第二个问题不知道是什么意思?

2006-12-04 12:47
快速回复:[求助]TASM不支持SIZEOF伪指令,如何求字符串长度
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016410 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved