龙空技术网

一文详解汇编语言偏移地址

黑猫编程 1588

前言:

此时朋友们对“汇编语言中dup是什么意思”都比较着重,姐妹们都需要知道一些“汇编语言中dup是什么意思”的相关文章。那么小编也在网络上汇集了一些对于“汇编语言中dup是什么意思””的相关知识,希望你们能喜欢,姐妹们快快来学习一下吧!

[bx+idata]

mov ax,[bx+200]相当于mov ax,200[bx],也相当于mov ax,[bx].200。

例如:假定内存2000:1000 BE 00 06 00 00 00 ...

下列程序执行后,ax、bx、cx中的内容为多少?

mov ax,[bx]:(ax)=00BEH

mov cx,[bx+1]:(cx)=0600H

add cx,[bx+2]:(cx)=0600H + 0060H = 0606H

si和di寄存器

si和di寄存器的功能与bx寄存器相近,都可以用来表示偏移地址。

目标:将字符串复制到后面的内存区域。

assume cs:code,ds:datadata segment     db 'blackcat'    db '........'data ends code segment   start:mov ax,data        mov ds,ax                 mov si,0        mov cx,8    s:  mov al,[si]        mov [si].8,al         inc si        loop s                 mov ax,4c00h         int 21h code ends end start
[bx+si+idata]

例如:假定内存2000:1000 BE 00 06 00 6A 22 ...

mov ax,[bx+2+si]:(ax)=0006H

mov cx,[bx+2+si]:(cx)=6A00H

mov bx,[bx+2+di]:(bx)=226AH

单词首字母转大写

问题:将data段数单词的首字母变为大写字母。

6个字符串,每个字符串长度为16个字节,不足16个字节用空格补位,使得偏移地址范围相同。

也可以将其看做6*16的二维数组,每个单词的首字母下标为3。

这也说明,二维数组逻辑结构上通过行和列索引数据,实际上依然是一维的存储结构。

单词每个字母转大写

枚举行,再枚举每一列,需要双重循环。

然而,我们只有一个cx计数器,那么再内层循环中对cx进行重新赋值,就会更改其外部的cx。比如用dx保存外层cx,内层循环结束,再恢复cx外层的数值。

这样实现有一个问题,寄存器数量是有限的,因此,进一步地,可以考虑使用一个内存单元保存cx临时值,就没有数量限制,这种操作方式比较复杂,而且用内存单元装cx数据,程序可读性也很差。

比较常用的方式是利用栈进行临时值存储,存储cx时push cx,恢复cx时pop cx。

assume cs:code,ds:data,ss:stackdata segment     db 'cat             '    db 'dog             '    db 'pig             '    db 'aaa             'data ends stack segment    dw 8 dup(0)stack endscode segment   start:mov ax,stack        mov ss,ax         mov sp,10h        mov ax,data        mov ds,ax                 mov bx,0        mov cx,4    s:  push cx        mov si,0        mov cx,3    s2: mov al,[bx+si]        and al,11011111B        mov [bx+si],al        inc si        loop s2        add bx,16        pop cx         loop s                  mov ax,4c00h         int 21h code ends end start

标签: #汇编语言中dup是什么意思