说出下列指令错误在哪里: (1)MOV CX , BL (2)MOV IP , BX (3)MOV ES , 1024H (4)MOV ES , DS (5)MOV AL , 450 (6)MOV [SP] , CX (7)MOV AX , BX + SI (8)MOV 40H , AH
时间: 2023-06-10 20:04:51 浏览: 500
(1) 指令无误,将 BL 寄存器的值移动到 CX 寄存器中。
(2) 指令错误,IP 寄存器是一个指令指针寄存器,不能直接移动值给它。
(3) 指令无误,将段寄存器ES的值设为1024H。
(4) 指令无误,将段寄存器ES的值设为数据段寄存器DS的值。
(5) 指令错误,AL 寄存器是一个字节寄存器,无法存储450这个16位数值。
(6) 指令无误,将 CX 寄存器的值存储到栈指针SP所指向的内存单元中。
(7) 指令错误,需要加上方括号 [ ],将数据段寄存器DS和BX寄存器中的值组成的地址所指向的内存单元中的内容移动到 AX和SI寄存器中。
(8) 指令错误,AH 寄存器是一个字节寄存器,无法存储40H这个8位数值。
相关问题
以子程序的形式改写assume cs:code data segment db 'welcome to masm!' db 2,36,113 ;颜色 data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov di,16 mov ax,0b800h mov es,ax mov si,160*12+35*2 mov cx,3 s: mov ah,ds:[di] push cx mov cx,16 s1: mov al,ds:[bx] mov es:[si],ax add si,2 inc bx loop s1 pop cx add si,128 inc di mov bx,0 loop s mov ax,4c00h int 21h code ends end start
以下是将该段代码改写为子程序的示例:
```assembly
; 定义数据段
data segment
db 'welcome to masm!'
db 2,36,113 ;颜色
data ends
; 定义代码段
code segment
assume cs:code, ds:data
; 定义子程序
print_string proc
push ax bx cx dx si di bp
mov si, 0
mov di, 0
mov bl, 0 ; 颜色
mov ah, 0x0e ; BIOS中断中用于输出字符的函数号
loop_start:
mov al, [string+si] ; 从数据段中读取字符
cmp al, 0 ; 判断是否已经读取到字符串末尾
je loop_end
mov ah, [color+si] ; 从数据段中读取颜色
mov bh, 0 ; BIOS中断中用于输出字符的页面号
mov cx, 1 ; 输出一个字符
int 0x10 ; 调用BIOS中断输出字符
inc si
jmp loop_start
loop_end:
pop bp di si dx cx bx ax
ret
print_string endp
start:
mov ax, data
mov ds, ax
call print_string ; 调用子程序输出字符串
mov ax, 4c00h
int 21h
code ends
end start
```
该程序使用了一个名为`print_string`的子程序,该子程序会将数据段中的字符串以及颜色输出到屏幕上。在主程序中,通过调用该子程序实现字符串的输出。
改写assume cs:code,ds:data data segment db 'welcome to masm!',0 data ends code segment start:mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call show_str mov ax,4c00h int 21h show_str: push ax push bx push es push si push cx mov ax,0b800h mov es,ax mov ax,160 mul dh mov bx,ax mov ax,2 mul dl add bx,ax mov al,cl mov cl,0 show0: mov ch,[si] jcxz show1 mov es:[bx],ch mov es:[bx].1,al inc si add bx,2 jmp show0 show1: pop cx pop si pop es pop bx pop ax ret code ends end start使其能在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm’。
在代码中添加以下内容即可实现要求:
```
mov ah, 0Ch ; 设置颜色
mov bh, 0 ; 显示页面号
mov cx, 14 ; 字符串长度
mov bl, 2 ; 绿色
mov al, ' '
mov di, 80 ; 水平居中
sub di, cx
shr di, 1 ; 右移一位,相当于除以2
mov si, offset msg ; 字符串地址
rep stosw ; 将字符串写入显存
; 显示绿底红色字符串
mov ah, 0Ch ; 设置颜色
mov bh, 0 ; 显示页面号
mov cx, 14 ; 字符串长度
mov bl, 2 ; 绿底
mov al, ' '
mov di, 80 ; 水平居中
sub di, cx
shr di, 1 ; 右移一位,相当于除以2
mov si, offset msg ; 字符串地址
rep stosw ; 将字符串写入显存
mov ah, 0Ch ; 设置颜色
mov bh, 0 ; 显示页面号
mov cx, 14 ; 字符串长度
mov bl, 4 ; 红色
mov al, ' '
mov di, 80 ; 水平居中
sub di, cx
shr di, 1 ; 右移一位,相当于除以2
mov si, offset msg ; 字符串地址
rep stosw ; 将字符串写入显存
; 显示白底蓝色字符串
mov ah, 0Ch ; 设置颜色
mov bh, 0 ; 显示页面号
mov cx, 14 ; 字符串长度
mov bl, 15 ; 白底
mov al, ' '
mov di, 80 ; 水平居中
sub di, cx
shr di, 1 ; 右移一位,相当于除以2
mov si, offset msg ; 字符串地址
rep stosw ; 将字符串写入显存
mov ah, 0Ch ; 设置颜色
mov bh, 0 ; 显示页面号
mov cx, 14 ; 字符串长度
mov bl, 1 ; 蓝色
mov al, ' '
mov di, 80 ; 水平居中
sub di, cx
shr di, 1 ; 右移一位,相当于除以2
mov si, offset msg ; 字符串地址
rep stosw ; 将字符串写入显存
msg db 'welcome to masm!', 0
```
其中,`msg` 存储字符串,`ah` 存储颜色,`bh` 存储显示页面号,`bl` 存储前景色和背景色,`cx` 存储字符串长度,`al` 存储空格,`di` 存储显存偏移量,`si` 存储字符串地址。
阅读全文