【问题标题】:TASM - Registers?TASM - 寄存器?
【发布时间】:2013-03-14 02:18:34
【问题描述】:

我很困惑寄存器在 TASM 或 Assembly 中的工作方式。尤其是在其中分配一个整数值时。我真的找不到清晰的教程。

谁能给我解释一下这些寄存器的用途:

AX, BX, CX, DX,

AH AL, BL BH, CL CH, DL DH

我看到一个使用 CX 作为循环计数器的程序。我也可以同时将它用作某个整数值的主机吗?

老实说,我有很多问题要问。我什至不知道如何在 x86 中执行加法、减法

我们的教授真的没有给我们任何参考。我们甚至没有被教导如何在汇编中进行数学运算。在讲座中,我们只给出了简要解释的代码(比如代码是如何工作的,而没有解释每一行的用途)。我们在活动中所做的就是复制粘贴他的代码,然后漫无目的地修改。

是的,他给出的任务是我们还不知道的。

抱歉在这里吐槽。

更新: 我想创建一个嵌套循环,这是一个伪代码。

; for (CX = 6; CX != 0; CX--) { // PSEUDO CODE, 
    ; for (BL = 0; BL != 7-CX; BL++) { 
        ; putchar(M+BL);
    ; }
    ; M--;
    ; putchar(10);
    ; putchar(13);
; }

我在尝试设置寄存器中的值时遇到了麻烦,因为我不知道它们是如何工作的。请向我解释我做错了什么。

【问题讨论】:

  • 你打算用这段代码开始多少主题?这使得 3
  • 您似乎没有在外循环结束时递减 CL?
  • 我认为每个循环都会将CX 减 1?所以CL不等于CX? @Gunner 我真的必须尽快完成这项工作,否则我的主题会失败。对不起。
  • ax, bx, cx, dx, al, ah, bl, @9876543336@, ch, cl, @987654338 @、dh 都是通用寄存器,有些功能只针对一个寄存器。参见例如。 swansontec.com/sregisters.htmleecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html(在 Google 搜索的第一个结果中:注册使用 x86 程序集)。
  • 您可以使用:“rep lodsb”或“rep stosb”,如此处所述:fermi.mn.it/linux/quarta/x86/rep.htm 自动递减 cx,但我不认为这是自动为您完成的,因为您有循环。

标签: assembly x86 tasm


【解决方案1】:

您没有在此处初始化 BL。您需要在内部循环之前将其设置为 0
INNER:


这里需要在执行中断之前将BL添加到DL,这样就可以得到伪代码中的M+BL字符。
MOV DL, M
INT 21H


应删除此代码,因为它将打印字符 7-CL(即“垃圾”)。
MOV DL, AL
INT 21H


这恰好适用于您的情况,但为了正确起见,它确实应该是 JMP 而不是 JNE。您已经在循环的前面有一个条件退出,所以这应该是一个无条件跳转。
JNE INNER

【讨论】:

  • 它应该是BL 而不是AL。我想我快疯了。所以我在MOV DL, MINT 21H 之后添加了MOV DL, BLINT 21H 请检查我更新的帖子,我似乎得到了不同的输出,带有笑脸字符和心形。但现在,它是金字塔形式,我希望这是一种改进吗?
  • 引用我自己的话:“你需要添加 BL到DL”。 MOVADD 不同。
  • 对不起。我一定是看错了。这一天对我来说压力太大了。编辑:烟的圣母!谢谢!
【解决方案2】:

试试这个链接:x86 Assembly Reference Sheet

没有更具体的问题,这里有一些基础知识。抱歉没有教程链接,这是记忆中的,如果您有任何具体问题,请告诉我,并会更新

; assign 100 to ax (16 bit)
mov ax, 100

; add ax to bx
add bx,ax

; add to ax, memory refereced by dx
add ax,[dx]

; add 8 bit 100 to al
add al, 100

ah,al,bl 等保存 8 位值

ax,bx,cx 等保存 16 位值

eax,ebx 等保存 32 位值

【讨论】:

  • 我正在尝试在程序集中创建一个嵌套循环。这个原理我试过了,请看我的程序。我更新了我的问题供您查看。是否可以使用不同的值两次使用 Cx?
  • 如果一个使用 xchg cx,bx 在退出内部循环时切换 cx 寄存器的内容,可以使用两个带有 LOOP 指令的嵌套循环。 (并使用 bx 作为外循环计数器)。回答您的一个问题:不,一个寄存器在任何时候只能保存一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2016-11-11
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多