XHXD. 2023-06-20 15:51 采纳率: 100%
浏览 17
已结题

汇编程序改写如何改写

请问如何在结果不变的情况下修改一下代码


data segment
io8255a    equ 28ah
io8255b    equ 28bh
io8255c    equ 288h
led        db  3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
buffer1    db  00,06
bz         dw  ?
mess       db  'TPCA omterrupt!',0dh,0ah,'$'
portc1     db  24h,44h,04h,44h,04h,44h,04h
           db  81h,82h,80h,82h,80h,82h,80h
           db  0ffh
data  ends
code  segment
      assume  cs:code,ds:data
start:
     mov ax,cs
     mov ds,ax
     mov dx,offset int3
     mov ax,250bh
     int 21h
     in  al,21h
     and al,0f7h
     out 21h,al
     mov cx,15
     sti
     mov ax,data
     mov ds,ax
     mov dx,io8255b
     mov al,80h
     out dx,al
ll:  mov dx,io8255a
re_on: mov bx,0
on:    mov al,portc1[bx]
     cmp al,0ffh
     jz re_on
     out dx,al
     inc bx
     mov cx,500                         ;控制黄灯的停顿时间
     test al,21h
     jz de1
     push ax
     push bx
     push cx
     push dx
     call shumaguang
     pop dx
     pop cx
     pop bx
     pop ax
     jmp next
de1: mov di,9000
de0: dec di
     jnz de0
     loop de1
next:push dx
     mov ah,06h
     mov dl,0ffh
     int 21h
     pop dx
     jz on
exit:mov ah,4ch
     int 21h
shumaguang proc
     mov di,offset buffer1
loop1:mov cx,07bh
loop2:mov bh,02
lll:  mov byte ptr bz,bh
     push di
     dec di
     add di,bz
     mov bl,[di]
     pop di
     mov bh,0
     mov si,offset led
     add si,bx
     mov al,byte ptr [si]
     mov dx,io8255c
     out dx,al
     mov al,byte ptr bz
     mov dx,289h
     out dx,al
     push cx
     mov cx,100
delay: loop delay
     pop cx
     mov al,00h
     mov bh,byte ptr bz
     shr bh,1
     jnz lll
     loop loop2
     mov ax,word ptr [di]
     cmp ah,00
     jnz set
     cmp al,00
     jnz set
     mov ax,0000h
     mov [di],al
     mov [di+1],ah
     jmp loop1
set: mov ax,word ptr [di]
     dec al
     aas
     mov [di],al
     mov[di+1],ah
     ret
shumaguang endp
jmp ll
int3:
     mov ax,data
     mov ds,ax
     mov dx,offset mess
     mov ah,09
     int 21h
     mov ax,0000
     mov[di],al
     mov [di+1],ah
     mov al,20h
     out 20h,al
     loop llll
     in al,21h
     or al,08h
     out 21h,al
     sti
     mov ah,4ch
     int 21h
llll:iret
code ends
     end start
     

  • 写回答

1条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-20 22:45
    关注

    汇编代码的改写需要具备一定的汇编语言知识和理解原代码的功能,同时保证改写后的代码功能相同。但这里需要注意的是,汇编语言的改写很有可能会引入新的错误或者不符合原有的设计意图。

    你的这段代码是处理某种特定硬件的操作,涉及到I/O操作,中断,程序控制流等部分。这样的代码,其逻辑往往是固定的,难以进行大幅度的改动,因为它需要与特定硬件的行为相适应。

    如果你需要对这段代码进行微小的修改,比如说改变某个延迟,更换某个端口地址,或者更改某个循环的计数器,那么直接找到相应的指令,按照汇编语言的语法进行修改即可。例如,如果需要改变停顿时间,可以修改 mov cx,500 这行代码中的 500

    如果你的目标是重构这段代码以提高可读性,你可以考虑以下几个方面:

    1. 添加注释:解释每个部分和指令的作用,这将大大增加代码的可读性。
    2. 使用有意义的标签名:替换如 ll, lll 等标签为具有实际意义的标签,如 delay_loop, read_port 等。
    3. 分解长程序:如果某个程序或子程序过长,可以考虑将其分解为几个较小的部分。

    然而,如果你的目标是进行大幅度的重构,比如说使用不同的算法或者数据结构,这可能会比较困难,因为汇编语言并不适合进行这类操作。

    总之,改写汇编代码需要清楚地理解你的目标和原代码的功能,并且必须熟悉汇编语言。如果你不确定如何进行,请寻求专业的帮助,避免引入新的错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月29日
  • 已采纳回答 6月21日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 hexo安装这种情况怎么办
  • ¥100 找hCaptcha图形验证码自动识别解决方案
  • ¥15 启动pycharm出错
  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程