PUSH WORD PTR[SI]这个程序是否正确 
时间: 2023-05-27 22:02:10 浏览: 23
这个程序不完整,需要更多的上下文和代码来判断是否正确。
"PUSH WORD PTR [SI]" 的意思是将SI所指向的内存地址上的16位数据压入栈中。这可能是汇编语言代码的一部分,但是缺少其他信息,无法确定该代码段是否正确,因为每个代码段的上下文和语法都有所不同。
相关问题
给出以下汇编语言代码的完整的注释data segment shuc db 'draw a yuan: $' hua1 db 'input yuanxin and banjing(example:310,220 200): $' zifu db 20 dup(0) ;此段用以临时存放输入字符 shu db 20 dup(0) ;再次存放输入数字的ASCII码转换华为的数字 suan db 24 dup(0) ;用来存放计算圆过程中产生的临时数据 data ends stack segment stk db 16 dup(0) stack ends code segment assume cs:code, ds:data,ss:stack start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov dx,offset shuc call showmsg call input mov al,ds:[si] and al,11011111b cmp al,43h draw1: mov dx,offset hua1 call showmsg call input call zhuanshu call moshi mov bx,offset shu mov ax,ds:[bx] mov si,ax mov ax,ds:[bx+2] mov di,ax mov ax,ds:[bx+4] call drawyuan mov ax,4c00h int 21h input: mov bx,0 mov cx,20 re: mov ah,1h int 21h cmp al,0dh jz scx mov si,offset zifu mov [bx][si],al inc bx loop re ret scx: mov cx,0 ret showmsg: mov ah,9h int 21h ret moshi: mov al,12h mov ah,0 int 10h ret zhuanshu: mov bx,offset zifu mov bp,offset shu mov cx,16 mov si,0 mov di,0 lei: mov al,ds:[bx][si] cmp al,0 jz scx sub al,30h mov dl,100 mul dl mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+1] sub al,30h mov dl,10 mul dl add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+2] sub al,30h add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax add si,4 add di,2 loop lei ret drawyuan: mov bx,offset suan mov word ptr ds:[bx],si mov word ptr ds:[bx+2],di sub si,ax mov word ptr ds:[bx+4],si sub di,ax mov word ptr ds:[bx+6],di shl ax,1 mov cx,ax mov word ptr ds:[bx+10],ax shr ax,1 xor dx,dx mul ax mov word ptr ds:[bx+12],ax mov word ptr ds:[bx+14],dx hang: push cx mov cx,ds:[bx+10] mov dx,di mov si,ds:[bx+4] lie: push cx push dx xor dx,dx mov cx,si mov ax,si sub ax,ds:[bx] xor dx,dx imul ax mov word ptr ds:[bx+16],ax mov word ptr ds:[bx+18],dx mov ax,di sub ax,ds:[bx+2] xor dx,dx imul ax add ax,ds:[bx+16] adc dx,ds:[bx+18] mov word ptr ds:[bx+20],ax mov word ptr ds:[bx+22],dx pop dx mov ax,ds:[bx+22] cmp ax,ds:[bx+14] jne kong mov ax,ds:[bx+12] sub ax,ds:[bx+20] cmp ax,500 ja kong mov ah,0ch mov al,5h int 10h kong: pop cx inc si loop lie pop cx inc di loop hang ret code ends end start
这段汇编代码是画圆的程序,其中包含了一些注释。
首先是数据段,其中定义了一些变量,如存放字符的数组,存放数字的数组,以及存放计算圆过程中产生的临时数据的数组。
接下来是堆栈段,用于存放程序运行时的栈空间。
最后是代码段,起始地址为start。程序开始时,将数据段和堆栈段的地址分别存入DS和SS寄存器中。然后调用showmsg过程,输出“draw a yuan:”这个字符串,再调用input过程,等待用户输入圆心和半径。接下来是一些数值转换的过程,将用户输入的数字转化为程序所需的格式。然后调用drawyuan过程,画出圆。最后调用int 21h,退出程序。
在代码段中,还有一些过程,如input过程用于读取用户输入,showmsg过程用于显示字符串,zhuanshu过程用于将用户输入的数字转化为程序所需的格式,moshi过程用于设置显示模式,drawyuan过程用于画圆。这些过程都有相应的注释说明其功能。
请对以下每部分代码作出必要的注释:DATA SEGMENT IO8255_A EQU 288H IO8255_C EQU 28AH IO8255_K EQU 28BH LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段码 BUFFER1 DB 0,0 ;存放要显示的十位和个位 BZ DW ? ;位码 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,IO8255_K ;将8255设为A口输出 MOV AL,80H OUT DX,AL MOV DI,OFFSET BUFFER1 ;设DI为显示缓冲区 LOOP1: MOV CX,030H ;循环次数 LOOP2: MOV BH,02 LLL: MOV BYTE PTR BZ,BH PUSH DI DEC DI ADD DI,BZ MOV BL,[DI] ;BL为要显示的数 POP DI MOV BH,0 MOV SI,OFFSET LED ;置LED数码表偏移地址为SI ADD SI,BX ;求出对应的LED数码 MOV AL,BYTE PTR [SI] MOV DX,IO8255_A ;自8255A的口输出 OUT DX,AL MOV AL,BYTE PTR BZ ;使相应的数码管亮 MOV DX,IO8255_C OUT DX,AL PUSH CX MOV CX,100 DELAY: LOOP DELAY ;延时 POP CX MOV AL,00H OUT DX,AL MOV BH,BYTE PTR BZ SHR BH,01H JNZ LLL LOOP LOOP2 ;循环延时 MOV AX,WORD PTR [DI] CMP AH,09 JNZ SET CMP AL,09 JNZ SET MOV AX,0000 MOV [DI],AL MOV [DI+1],AH JMP LOOP1
这段代码是8086汇编语言编写的,实现了一个将数字转换成LED数码管显示的功能。下面是每部分代码的注释:
```
DATA SEGMENT ;定义数据段
IO8255_A EQU 288H ;定义8255芯片的A口
IO8255_C EQU 28AH ;定义8255芯片的C口
IO8255_K EQU 28BH ;定义8255芯片的K口
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;定义LED数码管显示的16进制段码
BUFFER1 DB 0,0 ;定义存放要显示的十位和个位的缓冲区
BZ DW ? ;定义位码,表示要显示的是哪个数码管
DATA ENDS ;数据段结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;指定段寄存器
START: ;程序入口
MOV AX,DATA ;将数据段地址存入AX寄存器
MOV DS,AX ;将AX寄存器的值存入DS寄存器,DS寄存器指向数据段
MOV DX,IO8255_K ;将8255设为A口输出
MOV AL,80H ;将AL寄存器的值赋为80H
OUT DX,AL ;将AL值输出到DX指定的端口
MOV DI,OFFSET BUFFER1 ;将显示缓冲区的地址存入DI寄存器
LOOP1: ;第一层循环标签
MOV CX,030H ;将CX寄存器的值赋为030H,即循环次数
LOOP2: ;第二层循环标签
MOV BH,02 ;将BH寄存器的值赋为02
LLL: ;第三层循环标签
MOV BYTE PTR BZ,BH ;将BZ所指向的内存赋为BH的值
PUSH DI ;将DI寄存器的值压入栈中
DEC DI ;将DI寄存器的值减1
ADD DI,BZ ;将DI的值加上BZ的值,即位移
MOV BL,[DI] ;将DI所指向的内存的值赋给BL寄存器
POP DI ;将栈中的值弹出到DI寄存器中
MOV BH,0 ;将BH寄存器的值赋为0
MOV SI,OFFSET LED ;将LED数码表的偏移地址存入SI寄存器
ADD SI,BX ;将BX寄存器的值加上SI寄存器的值,即求出对应的LED数码
MOV AL,BYTE PTR [SI] ;将SI所指向的内存的值赋给AL寄存器
MOV DX,IO8255_A ;将8255芯片的A口存入DX寄存器
OUT DX,AL ;将AL寄存器的值输出到DX指定的端口
MOV AL,BYTE PTR BZ ;将BZ所指向的内存的值赋给AL寄存器
MOV DX,IO8255_C ;将8255芯片的C口存入DX寄存器
OUT DX,AL ;将AL寄存器的值输出到DX指定的端口
PUSH CX ;将CX寄存器的值压入栈中
MOV CX,100 ;将CX寄存器的值赋为100,即延时循环次数
DELAY: ;延时循环标签
LOOP DELAY ;循环延时
POP CX ;将栈中的值弹出到CX寄存器中
MOV AL,00H ;将AL寄存器的值赋为0
OUT DX,AL ;将AL值输出到DX指定的端口
MOV BH,BYTE PTR BZ ;将BZ所指向的内存的值右移一位,存入BH寄存器
SHR BH,01H ;将BH寄存器的值右移一位
JNZ LLL ;如果BH寄存器的值不为0,跳回LLL标签处
LOOP LOOP2 ;第二层循环
MOV AX,WORD PTR [DI] ;将DI所指向的内存的值存入AX寄存器
CMP AH,09 ;比较高位是否为9
JNZ SET ;如果高位不为9,跳转到SET标签处
CMP AL,09 ;比较低位是否为9
JNZ SET ;如果低位不为9,跳转到SET标签处
MOV AX,0000 ;将AX寄存器的值赋为0
MOV [DI],AL ;将低位存入DI所指向的内存
MOV [DI+1],AH ;将高位存入DI+1所指向的内存
JMP LOOP1 ;第一层循环
;SET标签:将数字加1
SET:
INC AX ;将AX寄存器的值加1
CMP AL,10 ;比较低位是否为10
JNZ SET1 ;如果低位不为10,跳转到SET1标签处
MOV AL,0 ;将低位赋为0
INC AH ;将高位加1
SET1:
MOV [DI],AL ;将低位存入DI所指向的内存
MOV [DI+1],AH ;将高位存入DI+1所指向的内存
JMP LOOP1 ;第一层循环
CODE ENDS ;代码段结束
相关推荐







