写出把首地址为BLOCK的字数组的第9个字送到CX寄存器的指令,要求分别用一下几种寻址方式寄存器寻址间接寻址、寄存器相对寻址、基址变址寻址
时间: 2024-10-16 15:03:23 浏览: 19
在x86汇编语言中,这里给出几个例子来说明如何将字数组的第9个元素送至CX寄存器,根据不同寻址方式:
1. **寄存器寻址** (如果假设BLOCK在ECX寄存器中作为偏移量,字数组在内存的起始地址已经在EAX中)
```assembly
mov ax, [eax + ecx*2] ; 字数组的每个元素大小为2个字节,所以偏移*2
```
2. **间接寻址** (通过存储的地址间接访问)
```assembly
mov eax, BLOCK ; 假设BLOCK地址已存在某个内存位置EAX
lea ebx, [eax + 9*2] ; 计算偏移9个字的位置
mov cx, [ebx] ; 从计算出的地址读取并放入CX
```
3. **寄存器相对寻址** (假设当前指令指针IP和BLOCK之间有一个固定的偏移值)
```assembly
; 假设当前指令指针IP到BLOCK有固定偏移0x50
add ip, 0x50 ; IP加上偏移得到字数组地址
mov cx, [ip] ; 从这个地址读取并放入CX
```
4. **基址变址寻址** (通常用于处理数组,假设BLOCK是基地址,DX是数组索引)
```assembly
mov cx, [BLOCK + dx*2] ; CX = BLOCK + (DX * 每个字的大小(2))
```
请注意,在实际应用中,需要确保所有这些操作都是有效的,并且考虑到CPU的状态和内存布局。
相关问题
1、阅读程序段: BLOCK DB 20H,1FH,08H,81H,0FFH,... RESULT DB ? ... START:LEA SI,BLOCK MOV CX,[SI] INC SI MOV AL,[SI] LOP1: CMP AL,[SI+1] JNG NEXT MOV AL,[SI+1] NEXT:INC SI LOOP LOP1 MOV RESULT,AL HLT 请问:(1)该程序完成的功能是什么? (2)该程序循环的次数是多少? 一、在 DEBUG 程序中,一条指令语句表示为 3200:0130 MOV AL,8。请问:(1)段地址、 偏移地址和物理地址分别为多少?(2)存放段地址和偏移地址的寄存器是哪两个?(8 分) 二、现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101)=34H,(20102H)=56H, (20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H,下列指 令寻址方式是什么?执行后 AX 寄存器的内容是多少?(8 分) (1)MOV AX,[BX] (2)MOV AX,1100H[BX] (3)MOV AX,[BX][SI] (4)MOV AX,1100H[BX SI] 三、对于下面的数据定义,各条 MOV 指令单独执行后,请写出相关寄存器的内容。(8 分) TABLEA DW 20 DUP(?) TABLEB DB 'ABCD' FLDB DB ? (1)MOV AX, TYPE FLDB (2)MOV CX, LENGTH TABLEA (3)MOV DX, SIZE TABLEA (4)MOV CX, LENGTH TABLEB 四、编写程序段,实现(1)将长度为 10 的字符串 string1 内容复制到字符串 string2 中;(2)
(1) 该程序的功能是将一个数据块中的相邻两个字节进行比较,将其中较大的一个存入 RESULT 中。(2) 循环的次数为数据块 BLOCK 中字节的数量减一。
一、段地址为 3200H,偏移地址为 0130H,物理地址为 3200:0130H。存放段地址的寄存器是 DS,存放偏移地址的寄存器是 SI。
二、(1) 寻址方式为基址寻址,AX 的内容为 0012H。(2) 寻址方式为基址加变址寻址,AX 的内容为 3456H。(3) 寻址方式为基址加变址寻址,AX 的内容为 0002H。(4) 寻址方式为基址加变址寻址,AX 的内容为 4C2AH。
三、(1) AX 中存放 FLDB 的类型,即 DB。(2) CX 中存放 TABLEA 的长度,即 40。(3) DX 中存放 TABLEA 占用的字节数,即 80。(4) CX 中存放 TABLEB 的长度,即 4。
四、(1) 代码如下:
```assembly
MOV SI, OFFSET string1 ; 将 string1 地址存入 SI
MOV DI, OFFSET string2 ; 将 string2 地址存入 DI
MOV CX, 10 ; 将字符串长度存入 CX
REP MOVSB ; 复制字符串
```
(2) 代码如下:
```assembly
MOV SI, OFFSET string1 ; 将 string1 地址存入 SI
MOV DI, OFFSET string2 ; 将 string2 地址存入 DI
MOV CX, 10 ; 将字符串长度存入 CX
BACK: MOV AL, [SI] ; 将 string1 中的字符存入 AL
MOV [DI], AL ; 将 AL 中的字符存入 string2
INC SI ; 增加 string1 的地址
INC DI ; 增加 string2 的地址
LOOP BACK ; 循环
```
阅读全文