注册 登录
编程论坛 汇编论坛

[求助]TASM不支持SIZEOF伪指令,如何求字符串长度

yuki 发布于 2006-06-30 16:21, 2312 次点击

刚学了两天的汇编非常的菜,做了个两个等长字符串的比较程序,用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就可以了。

8 回复
#2
yuki2006-07-01 08:58

虽然没有人回复,但还是要谢谢大家的关注。
问题已经解决了,我重新写了个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编辑过]

#3
‰唯我2006-12-04 10:27
[求助]编译原理问题

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

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

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

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

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

#4
菜鸟上路2006-12-04 12:38
好象可以用LENGTH
#5
菜鸟上路2006-12-04 12:41
以下是引用‰唯我在2006-12-4 10:27:54的发言:

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

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

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

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

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

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

#6
‰唯我2006-12-04 12:45

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

这个有用!

#7
菜鸟上路2006-12-04 12:46
左上角“发表文章”
#8
菜鸟上路2006-12-04 12:47
你问的第二个问题不知道是什么意思?
1