【问题标题】:LDA < subroutine x86 assembly emu 6502LDA <子程序x86汇编emu 6502
【发布时间】:2017-01-12 15:54:40
【问题描述】:

我正在尝试为我的大学练习理解这个 emu6502 汇编代码。该代码将八进制数转换为二进制数。

                opt f-g-h+l+o+
                org $1000

start           equ *

                lda <text
                sta $80
                lda >text
                sta $81
                ldy #0
                lda #$a5
                jsr binary

                lda <text
                ldx >text
                jsr $ff80
                brk

binary          sta byte
                ldx #7
bitslp          lda #'0'
                asl byte
                bcc pr
                lda #'1'
pr              sta ($80),y
                iny
                dex
                bpl bitslp
                rts

byte            dta b(0)

                org $2000
text            equ *
                dta b(0),b(0),b(0),b(0)
                dta b(0),b(0),b(0),b(0)
                dta b(10) ; '\n'
                dta b(0)

                org $2E0
                dta a(start)

                end of file

我不知道这些行中的 符号代表什么:lda &lt;textldx &gt;text 以及与equ * 一致的目的?我在互联网上阅读了很多文章,但没有找到关于 lda 之后的大于、小于符号和 equ 之后的星号符号的任何内容。

我也不知道如何为程序提供输入。 (要转换的数字)

【问题讨论】:

  • &lt; 是值的低字节部分,&gt; 是值的高字节部分。
  • equ 为符号定义了一些值(如“symbol = X”)(它是汇编程序的指令,而不是 CPU 的指令)。 * 是特殊值“当前地址”,机器代码的下一个字节将落在该地址。 start 位于地址 $1000,因为在它前面的目标地址是由 org 指令设置的,还没有生成机器代码。
  • text 是一个 8 字节缓冲区的地址。前四个指令将文本地址存储到位置 $80(地址的低位部分)和 $81(地址的高位部分)中。
  • 实际上将一些文档提供给您的汇编器,我不确定* 是否 100%,看起来 6502 汇编器有很多约定。虽然我的回答在这种情况下最有意义,但如果您有汇编程序的文档,请相信它。
  • “将八进制数转换为二进制数”是什么意思?查看您的代码,它只是将十六进制数 0xA5 转换为地址 @0x2000 处的 8 个字节,表示 ascii 格式的每个位(0 或 1),从 bit7 到 bit0。然后它调用地址 0xff80 的未知子程序。

标签: assembly


【解决方案1】:

显示的代码将 A 中的值转换为 2000 美元的 ascii 字符串

你的代码的主要部分是这个

binary          sta byte          ; store value to be encoded
                ldx #7            ; loop counter: 1 + 7 times = 8 repeats

; shift A bit by bit, and convert each bit into "0" or "1"

bitslp          lda #'0'          ; default value for bit: not set "0"
                asl byte          ; check next bit (top bit -> carry)
                bcc pr            ; bit clear? keep the "0"
                lda #'1'          ; otherwise use a "1" ...

; store the ascii result at "string pointer" ($80/$81)+y

pr              sta ($80),y       ; ... and store it
                iny               ; y++ (increase string "pointer")

                dex               ; loop counter
                bpl bitslp        ; loop branch
                rts

周围的代码只是加载值
- 2000 美元到 [$80/$81](“字符串”),
- $0 到 Y (这将 imo 属于“二进制”子例程),并且
- $F4 (一个样本值) 转换成 A 被转换
最后调用 $ff80 (也许是一些输出函数?谁知道:-))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多