指令系统

143 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

读程序

建立00H~09H~00H 19个数,00H~09H数据逐渐增大,09H~00H逐渐减小,即SI指针所表示的地址中依次填入00H~09H~00H19个数。

  ORG 100H     
       MOV   SI, 0 // SI中的值为0
       MOV   CL, 09H // CL指针的值为9
       XOR    AX, AX // AX为0,里面的寄存器AL、AH也为0
PPE1:  MOV    [SI], AL // [0000] = 0
       INC     SI // 0001
       INC     AL // 01
       DEC     CL // 指针减1
       JNZ     PPE1   //运算结果不为0则跳转到PRE1
       MOV    CX, 0AH // 重新设置CX计数器的值为10
PPE2:  MOV    [SI], AL 
       INC     SI
       DEC    AL
       LOOP   PPE2   
       INT     20H
       RET

编程实现两个32位的二进制数据(或4个字节)对应字节两两相加。

org 100h
    vec1 db 1,2,5,6 // 定义一个数组,名字为vec1,这个数组的地址,也就是第一个数存放的地址为0100H
    vec2 db 3,5,6,1
    vec3 db 4 dup(0)
start:
	lea si,vec1 // 取vec1这个数组的地址,或者说这个数组的第一个数的地址
    lea bx,vec2
    lea di,vec3    
        
    mov cs,4	// 数据指针

sum:
	mov al,[si] // 以SI中的内容作为地址,然后将这个地址中的内容送到寄存器al中
    add al,[bx] // 以bx中的内容作为地址,然后将这个地址中的内容与寄存器al中的内容相加
    mov [di],al // 将结果送到[di]中
        
    inc si// 指针加1
    inc bx
    inc di
        
    loop sum// 循环,次数由cx中的内容确定,cx自动减1,不为0就跳转到sum
    
     ret
       

程序填空

2、设有200个字节数据(补码),存放在数据段中EA=3000H的存储区内,编程实现从该数据区中找出最大数并存入同一数据段EA=3200H的单元中。

MAX:     
MOV BX,3000H
MOV AL,[BX]
MOV CX,199 
    
LOOP1:   
INC  BX
CMP AL,[BX]
JGE  LOOP2  // 运算结果大于或等于则跳转到LOOP2
MOV AL,[BX] // 保证AL中的数是最大的
    
LOOP2:   
DEC  CX          
JNZ   LOOP1      
MOV [3200H],AL

写程序

4、在数据段中从0500H单元开始存放着18个8位带符号数,要求把其中的正数传送至2000H开始的存储区;负数传送至3000H开始的存储区,且分别统计正数和负数的个数,并将正数和负数的个数分别存入3200H和3201H单元中。