在组件x86中处理字符串(mov并打印到屏幕)

时间:2014-10-22 01:14:22

标签: string assembly tasm

我正在开展一个更大的项目,但我仍然坚持使用字符串操作。我的汇编文件包括数学协处理器操作(它用“FINIT”启动协处理器),但我认为它根本不应该干扰。 基本上,我有一些长度为50字节的字符串:

$s db 50 dup (?), '$'
_cte_14 db "hello world", '$', 39 dup (?)

我需要将变量“_cte_14”中存储的值赋给变量“$ s” 我试图使用寄存器临时存储值,如下所示:

mov cx, _cte_14
mov $s, cx

但我得到“操作数类型不匹配”错误。

由于我知道AX,BX,CX,DX寄存器只保存16位,我想也许我需要使用第一个字符串字符的内存地址,所以我试过了:

mov bx, offset _cte_14
mov $s, bx

但出现同样的错误。

我正在使用TASM来编译x86处理器。什么是实现这一目标的正确方法?

提前多多感谢。

1 个答案:

答案 0 :(得分:1)

在循环中复制字符的示例:

s db 51 dup ('$')
_cte_14 db "hello world"
len = ($ - _cte_14)    ; (current location - offset _cte_14)
40 dup ('$')

mov si, offset _cte_14 ; get source offset
mov di, offset s       ; get destination offset
mov cl, len            ; length of the string
P1:
mov al, [si]           ; get byte from DS:SI
mov [di], al           ; store byte to DS:DI
dec cl                 ; decrease counter, set zero flag if zero
jnz P1                 ; jump if zero flag is not set

- 使用字符串指令和重复指令前缀的变化:

mov si, offset _cte_14
mov di, offset s
mov cx, len ; length of the string
cld         ; clear direction flag
rep movsb   ; copy from DS:SI to ES:DI, increase SI+DI, decrease CX, repeat CX times